5
我有返回到多態對象列表的引用的方法(或功能):Boost Python:多態容器?
class A {
};
class B : public A {
};
std::list<boost::shared_ptr<A> >& getList();
如何在提振揭露這樣的功能::蟒蛇使得蟒蛇名單上迭代時,我會看到不同類型的A
s和B
s?
我有返回到多態對象列表的引用的方法(或功能):Boost Python:多態容器?
class A {
};
class B : public A {
};
std::list<boost::shared_ptr<A> >& getList();
如何在提振揭露這樣的功能::蟒蛇使得蟒蛇名單上迭代時,我會看到不同類型的A
s和B
s?
首先,確保你的類確實是多態的(即它們至少有一個虛函數或虛析構函數)。上面的例子沒有,但我確定你的真實用例。如果沒有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中),但對於簡單的問題,這可能是最方便的。
確實,虛擬角色是我所缺少的。 – shoosh
關於如何包裝返回一個容器的函數的問題: 這個方法也可以直接展示返回boost :: python :: list的方法。 也就是說通過將boost :: shared_ptr附加到列表的多態python元素。在運行時訪問列表時,取消引用指針將按照描述隱式完成(如果register_ptr_to_python <>定義確實存在)。 – StefanQ