3

これは、ドキュメントを使用しても答えられなかった 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

4

1 に答える 1