2016-10-27 3 views
1

filter 클래스를 C++로 구현했으며 파이썬에서 사용하기 위해이 코드를 Cython으로 배치하려고합니다. 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

사실, 당신의 솔루션은 다음 그런 다음에 추가

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

: init가 호출 할 수있는, 클리너 더 좋은 방법 :

다른 솔루션 그냥 오버로드 된 생성자를 추가하는 것입니다 귀하의 파이썬 클래스

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

다른 솔루션은 오버로드 된 생성자 만있는 것입니다. –