Boost Python:多态容器?

时间:2012-05-14 08:22:05

标签: c++ python boost polymorphism boost-python

我有一个方法(或函数),它返回对多态对象列表的引用:

class A {

};
class B : public A {

};


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

如何在boost :: python中公开这样的函数,以便在python中的列表上进行迭代时,我会看到不同类型的AB s?

1 个答案:

答案 0 :(得分: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只能看到派生最多的类型。没有必要做任何特别的事情来确保A在可能的情况下被B投放。

这仍然存在如何包装返回容器的函数的问题。最简单的可能是使用Boost.Python中包含的索引套件:

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

网络上还有其他选项(包括索引套件的“版本2”,在许多方面都更好,但不包含在Boost.Python中),但对于简单的问题,这可能是最方便的