gpt4 book ai didi

c++ - boost Python : polymorphic container?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:08 26 4
gpt4 key购买 nike

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

class A {

};
class B : public A {

};


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

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

最佳答案

首先,确保你的类确实是多态的(即它们至少有一个虚函数或一个虚析构函数)。您上面的示例没有,但我确定您的真实用例确实如此。没有它,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 中),但对于简单的问题,这可能是最方便的.

关于c++ - boost Python : polymorphic container?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com