升压的Python:多态的容器?(Boost Python: polymorphic contain

2019-07-29 09:02发布

我有返回到多态性的对象的列表的参考的方法(或功能):

class A {

};
class B : public A {

};


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

如何揭露升压这样的功能::蟒蛇使得蟒蛇名单上迭代的时候,我会看到不同类型的A S和B S'

Answer 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

还有其他的选择浮动网络(包括索引套件,在许多方面更好,但不包括在Boost.Python的一个“2版”)左右,但对于简单的问题,这可能是最方便的。



文章来源: Boost Python: polymorphic container?