2016-10-27 6 views
1

Я реализовал класс filter в C++, и я работаю над его переносом с помощью Cython для использования в Python. Класс Cython MyFilter в настоящее время выглядит следующим образом.Инициализировать объект C++ с аргументами из конструктора Cython

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

На самом деле, ваше решение уборщик может быть лучше :)

Другое решение просто добавить перегруженный конструктор, который вы можете звонить из INIT .:

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

Другим решением будет просто перегруженный конструктор. –

 Смежные вопросы

  • Нет связанных вопросов^_^