2012-05-14 5 views
5

Iが多型オブジェクトのリストへの参照を返すメソッド(または関数)を持っている:Pythonでリストの繰り返し処理を行う場合、そのようBoost Python:ポリモーフィックコンテナ?

class A { 

}; 
class B : public A { 

}; 


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

どのように私は、ブースト:: pythonでこのような機能を公開しますか、私はABの異なる種類がありますか?

答えて

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がしかmost-を見ていることを確認するために行う必要があるすべてです派生型です。可能であれば、ABにキャストされるように特別な処理をする必要はありません。

それでも、コンテナを返す関数をラップする方法の問題が残ります。最も単純には、おそらくBoost.Pythonに含まれているインデックス・スイートを使用することです:

http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html

多くの点で優れているインデックス・スイートの「バージョン2」を含むウェブの周りに浮い他のオプションは(あり、 Boost.Pythonには含まれていませんが、単純な問題ではおそらく最も便利です。

+0

確かに、仮想ドルは私が欠けていたものでした。 – shoosh

+0

コンテナを返す関数をラップする方法についての質問: このメソッドは、boost :: python :: listを返すメソッドを公開することでも簡単に動作します。 I. boost :: shared_ptrをポリモフィックなpython要素にリストに追加します。実行時にリストにアクセスするときにポインタを間接参照することは、(register_ptr_to_python <>の定義が存在する場合)記述されているように暗黙的に行われます。 – StefanQ

関連する問題