2016-10-27 36 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

另一種解決方案是隻有一個重載的構造函數。 –

相關問題