2012-05-14 91 views
5

我有返回到多態對象列表的引用的方法(或功能):Boost Python:多態容器?

class A { 

}; 
class B : public A { 

}; 


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

如何在提振揭露這樣的功能::蟒蛇使得蟒蛇名單上迭代時,我會看到不同類型的A s和B s?

回答

4

首先,確保你的類確實是多態的(即它們至少有一個虛函數或虛析構函數)。上面的例子沒有,但我確定你的真實用例。如果沒有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-派生類型。沒有必要做任何特殊的事情來確保在可能的情況下A被鑄造爲B

這仍然留下如何包裝返回容器的函數的問題。最簡單的可能是使用附帶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的方法。 也就是說通過將boost :: shared_ptr附加到列表的多態python元素。在運行時訪問列表時,取消引用指針將按照描述隱式完成(如果register_ptr_to_python <>定義確實存在)。 – StefanQ