5

ポリモーフィック オブジェクトのリストへの参照を返すメソッド (または関数) があります。

class A {

};
class B : public A {

};


std::list<boost::shared_ptr<A> >& getList();

Aboost::python でそのような関数を公開して、python でリストを反復処理するときに、さまざまなタイプのs とsが表示されるようにするにはどうすればよいBですか?

4

1 に答える 1

4

まず、クラスが実際にポリモーフィックであることを確認します (つまり、少なくとも 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」を含む) が、単純な問題の場合はおそらくこれが最も便利です。

于 2012-05-14T15:50:36.353 に答える