2016-10-27 9 views
1

私はfilterクラスをC++で実装しています。これを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ラッパーを機能させるためには、デフォルトの引数のないコンストラクタを定義してから、__cinit__コンストラクタから引数が入手できたら、オブジェクトを初期化するためにinit()関数を追加する必要がありました。これにより、C++コードの複雑さが増しました。

これを行うにはよりクリーンで良い方法がありますか?私は必要に応じてポインタを避けたいですが、説得力のある議論で確信しているかもしれません。

+0

移譲代入演算子は少し綺麗かもしれませんか?必要なコードの総量はかなり似ていますが、これはきれいなC++インターフェイスです。 – DavidW

答えて

0

実際には、あなたのソリューションはきれい良い方法:)

IS他の解決策は、あなたが、その後のinitから呼び出すことができます。:

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

その後、あなたに追加、単にオーバーロードされたコンストラクタを追加することですPythonクラス

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

他の解決策は、オーバーロードされたコンストラクタを持つことです。 –

関連する問題