これは、ドキュメントを使用しても答えられなかった boost.python の質問です。
B が A のサブクラスであるような 2 つの C++ クラス A と B があり、特定の条件下では、型 A のオブジェクトを型 B のオブジェクトに変換できます。これらのクラスは両方とも class_<> でエクスポートされています。概略的に:
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") ... ;
可能であれば、クラス A の to-python コンバーターがクラス B のオブジェクトを返すようにしたいと考えています。それ以外の場合は、クラス A のオブジェクトを返す必要があります。
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::convert() が再帰的に呼び出されるため、無限ループが発生します。A が class_<> で既にエクスポートされている場合、レジストリをバイパスし、A_to_python_converter を経由せずにクラス A のオブジェクトを (PyObject *) に変換する方法はありますか? それは私の問題をきれいに解決するでしょう(私は他の提案を受け入れますが)。
ありがとう!K