2016-10-27 143 views
1

我已经在C++中实现了一个filter类,并且我正在使用Cython在Python中使用它进行封装。 Cython MyFilter类目前看起来像这样。使用Cython构造函数的参数初始化C++对象

cdef class MyFilter: 
    cdef filter f; 
    def __cinit__(self, list array_sizes): 
     cdef vector[size_t] as = array_sizes 
     self.f.init(as) 
    def add(self, uint32_t value): 
     self.f.add(value) 
    def get(self, uint32_t value): 
     return self.f.get(value) 

本来,C++类有这花了std::vector<size_t>作为参数传递一个构造函数。但为了使Cython包装工作,我必须定义一个默认的无参数构造函数,然后添加一个init()函数来初始化该对象,一旦参数可从__cinit__构造函数中获得。这给C++代码增加了一些不必要的复杂性。

是否有更干净或更好的方法来做到这一点?如果有必要,我想避免使用指针,但可能会引起强烈的争论。

+0

移动赋值运算符可能有点整齐?所需的代码总量非常相似,但它是一个更加整洁的C++接口。 – DavidW

回答

0

其实,你的解决方案是更清洁更好的办法:)

其他解决方案只是增加一个重载的构造函数,然后你可以从初始化:

cdef cppclass myclass: 
    myclass() except + 
    myclass(args) except + 

然后添加到您的来电python class

cdef class myPyClass: 
    cdef myclass pclass 
    def __cinit__(self,args): 
     pclass = new myclass(args)   
+0

另一种解决方案是只有一个重载的构造函数。 –

相关问题