Boost Python:多态容器?

sho*_*osh 5 c++ python polymorphism boost boost-python

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

class A {

};
class B : public A {

};


std::list<boost::shared_ptr<A> >& getList();
Run Code Online (Sandbox Code Playgroud)

我如何在boost :: python中公开这样的函数,以便在python中迭代列表时,我会看到不同类型的As和Bs?

jbo*_*sch 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> >();
}
Run Code Online (Sandbox Code Playgroud)

...这就是确保 Python 只看到最派生类型所需要做的全部事情。无需执行任何特殊操作来确保在可能的情况A下进行强制转换B

这仍然留下了如何包装返回容器的函数的问题。最简单的可能是使用 Boost.Python 附带的索引套件:

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

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