使用Cython构造函数的参数初始化C++对象
问题描述:
我已经在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++代码增加了一些不必要的复杂性。
是否有更干净或更好的方法来做到这一点?如果有必要,我想避免使用指针,但可能会引起强烈的争论。
答
其实,你的解决方案是更清洁更好的办法:)
其他解决方案只是增加一个重载的构造函数,然后你可以从初始化:
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
另一种解决方案是只有一个重载的构造函数。 –
移动赋值运算符可能有点整齐?所需的代码总量非常相似,但它是一个更加整洁的C++接口。 – DavidW