ポリモーフィック オブジェクトのリストへの参照を返すメソッド (または関数) があります。
class A {
};
class B : public A {
};
std::list<boost::shared_ptr<A> >& getList();
A
boost::python でそのような関数を公開して、python でリストを反復処理するときに、さまざまなタイプのs とsが表示されるようにするにはどうすればよいB
ですか?
ポリモーフィック オブジェクトのリストへの参照を返すメソッド (または関数) があります。
class A {
};
class B : public A {
};
std::list<boost::shared_ptr<A> >& getList();
A
boost::python でそのような関数を公開して、python でリストを反復処理するときに、さまざまなタイプのs とsが表示されるようにするにはどうすればよいB
ですか?
まず、クラスが実際にポリモーフィックであることを確認します (つまり、少なくとも 1 つの仮想関数または仮想デストラクタがある)。上記の例はそうではありませんが、実際のユースケースではそうです。それがなければ、Boost.Python の RTTI ベースの多態性機構は機能しません。
次に、Boost.Python を使用して両方のクラスを公開しshared_ptr
、それらのコンバーターを登録した場合:
#include <boost/python.hpp>
namespace bp = boost::python;
BOOST_PYTHON_MODULE(example) {
bp::class_<A >("A");
bp::register_ptr_to_python< boost::shared_ptr<A> >();
bp::class_< B, bp::bases<A> >("B");
bp::register_ptr_to_python< boost::shared_ptr<B> >();
}
...これで、Python が最も派生した型だけを認識できるようにする必要があります。A
が確実にキャストされるようにするために特別なことをする必要はありませんB
。
それでも、コンテナーを返す関数をラップする方法の問題が残ります。おそらく最も簡単なのは、Boost.Python に含まれているインデックス作成スイートを使用することです。
http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html
Web には他のオプションが浮かんでいます (多くの点で優れているが、Boost.Python には含まれていないインデックス作成スイートの「バージョン 2」を含む) が、単純な問題の場合はおそらくこれが最も便利です。