Как я могу преобразовать производный класс Python в его базу c ++ с помощью Boost Python?

У меня есть класс C ++ с чисто виртуальной функцией, которую я обертываю следующим образом, используя Boost Python:

class Model {
virtual double Test() = 0;
};
class ModelWrapper : public Model, public boost::python::wrapper<Model> {
double Test() {
return this->get_override("Test")();
}
};
BOOST_PYTHON_MODULE(mymodule)
{
class_<ModelWrapper, boost::noncopyable>("Model")
.def("Test, pure_virtual(&Model::Test))
;
}

У меня также есть функция c ++, которая ожидает объект Model в качестве аргумента:

double MyFunction(Model& m) {
return m.Test()
}

Теперь я хотел бы сделать производный класс в Python, который переопределяет функцию Model :: Test, но все еще может быть передан MyFunction. Что-то вроде этого:

from mymodule import *

class NewModel(Model):
def Test(self):
return 0.5

m = NewModel()
print(MyFunction(m))

который я хотел бы распечатать 0,5 в этом случае. Вместо этого я получаю эту ошибку:

> ArgumentError: Python argument types in
>     mymodule.MyFunction(NewModel) did not match C++ signature:
>     MyFunction(Model {lvalue})

Я не уверен, какой шаг мне не хватает, чтобы NewModel можно было использовать там, где ожидается Model. Любое понимание будет с благодарностью.

1

Решение

Мне нужно было явно добавить «Model .__ init __ (self)» в функцию NewModel __init__. После этого все заработало нормально.

2

Другие решения


По вопросам рекламы [email protected]