【问题标题】:Boost Python: polymorphic container?Boost Python:多态容器?
【发布时间】:2012-05-21 17:24:37
【问题描述】:

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

class A {

};
class B : public A {

};


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

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

【问题讨论】:

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


    【解决方案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

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

    【讨论】:

    • 确实,我错过了一个虚拟的d'tor。
    • 关于如何包装返回容器的函数的问题:此方法也适用于公开返回 boost::python::list 的方法。 IE。通过将 boost::shared_ptr 附加到多态 python 元素到列表中。然后,在运行时访问列表时取消引用指针将按照所述隐式完成(如果所述 register_ptr_to_python 定义确实存在)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多