我有返回到多态性的对象的列表的参考的方法(或功能):
class A {
};
class B : public A {
};
std::list<boost::shared_ptr<A> >& getList();
如何揭露升压这样的功能::蟒蛇使得蟒蛇名单上迭代的时候,我会看到不同类型的A
S和B
S'
我有返回到多态性的对象的列表的参考的方法(或功能):
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的永远只能看到最底层派生型。 有没有必要做任何特殊,以确保A
被强制转换为B
可能的情况下。
但这仍然没有如何包装一个返回容器的功能的问题。 最简单的可能是使用附带Boost.Python的索引套件:
http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html
还有其他的选择浮动网络(包括索引套件,在许多方面更好,但不包括在Boost.Python的一个“2版”)左右,但对于简单的问题,这可能是最方便的。