C++ boostpython:多态容器?

C++ boostpython:多态容器?,c++,python,boost,polymorphism,boost-python,C++,Python,Boost,Polymorphism,Boost Python,我有一个方法(或函数),它返回对多态对象列表的引用: class A { }; class B : public A { }; std::list<boost::shared_ptr<A> >& getList(); A类{ }; B类:公共A{ }; std::list&getList(); 如何在boost::python中公开这样一个函数,以便在python中迭代列表时,可以看到不同类型的as和Bs?首先,确保类确实是多态的(即它们至少有一个虚拟

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

class A {

};
class B : public A {

};


std::list<boost::shared_ptr<A> >& getList();
A类{
};
B类:公共A{
};
std::list&getList();

如何在boost::python中公开这样一个函数,以便在python中迭代列表时,可以看到不同类型的
a
s和
B
s?

首先,确保类确实是多态的(即它们至少有一个虚拟函数或虚拟析构函数)。你上面的例子没有,尽管我确信你真正的用例有。如果没有这一点,Boost.Python基于RTTI的多态机制将无法工作

然后,如果您使用Boost.Python公开了这两个类,并为它们注册了
shared\u 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> >();
}
#包括
名称空间bp=boost::python;
BOOST_PYTHON_模块(示例){
bp::类_


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

事实上,我缺少的是一个虚拟的d'tor。关于如何包装返回容器的函数的问题:该方法还可以直接用于公开返回boost::python::list的方法。例如,将boost::shared_ptr附加到多态python元素在运行时访问列表时取消对指针的引用将按照所述隐式完成(如果所述register_ptr_to_python定义确实存在)。