Вот вопрос boost.python, на который я не мог ответить, используя документацию.обход реестра to_python для класса, экспортированного с помощью класса _ <>?
У меня есть два класса C++ A и B, такие, что B является подклассом A, и при определенных условиях объект типа A может быть преобразован в объект типа B. Оба эти класса экспортируются с классом_ <>. Схематично:
class A
{
public:
bool is_B() const { ... } // returns true if conversion to B will succeed
...
};
class B : public A {
B(const A &a) { ... } // should only be called if a.is_B() == true
...
};
class_<A>("A") ... ;
class_<B,bases<A> >("B") ... ;
Я хотел бы конвертер к-питона для класса А, чтобы вернуть объект класса B, если это возможно; в противном случае он должен возвращать объект класса А. Схематически:
struct A_to_python_converter {
PyObject *convert(const A &a) {
if (a.is_B())
// return object of class B
return boost::python::incref(boost::python::object(B(a)).ptr());
else
... // return object of class A
}
}
boost::python::to_python_converter<A,A_to_python_converter>();
Проблема заключается в том, что я не уверен, что код поставить на место «...» выше. Если я ставлю:
// return object of class A
return boost::python::incref(boost::python::object(a).ptr());
тогда я получаю бесконечный цикл, так A_to_python_converter :: обращенного() будет вызываться рекурсивно. Есть ли способ обойти реестр и преобразовать объект класса A в (PyObject *) без прохождения A_to_python_converter, учитывая, что A уже экспортирован с классом <>? Это решило бы мою проблему чисто (хотя я открыт для других предложений).
Спасибо! K