Я пытаюсь создать объект, используя boost python. Определение класса (псевдокод):
class Awrap : public A, public boost::python::wrapper<A> {
static std::shared_ptr<A > Create(...) { ... } // inherited from A
virtual double foo(...) override { // overrides pure virtual function in A
return this->get_override("foo")(...);
}
};
BOOST_PYTHON_MODULE() {
using namespace boost::python
class_<Awrap,std::shared_ptr<Awrap>, boost::noncopyable>("A",boost::python::no_init)
.def("Create",&A::Create).staticmethod("Create")
.def("foo",pure_virtual(&Awrap::foo));
boost::python::register_ptr_to_python<std::shared_ptr<A> >();
}
Проблема в том, что когда я реализую дочерний элемент в python и вызываю статический метод create, он создает указатель на Awrap (а не на дочерний элемент). Таким образом, он не может найти версию python для "foo". Если я реализую foo в классе Awrap вместо дочернего элемента python, он отлично работает, но я не хочу этого делать!
Какие-либо предложения?
Благодарю!
Вам нужно разоблачить оба параметра Awrap::foo
и A::foo
чтобы повысить уровень python. См. Пример в:
http://www.boost.org/doc/libs/1_54_0/libs/python/doc/tutorial/doc/html/python/exposing.html