Boost.Python 如何拥有 C++ 类?

Posted

技术标签:

【中文标题】Boost.Python 如何拥有 C++ 类?【英文标题】:How does Boost.Python hold C++ class? 【发布时间】:2015-01-28 06:39:38 【问题描述】:

我知道如何使用 Boost.Python 来包装暴露给 Python 的 C++ 类。 使用 Boost.Python 如此方便地进行包装,真的很强大。

然而,关于 Boost.Python 如何持有 C++ 类的细节很少被解释。

Boost.Python 的代码很难阅读或调试,因为它是以模板元编程方式编写的,所有东西都只是在编译时执行。我浏览了作者的文档和“使用 Boost Python 构建混合系统”一文,但没有找到答案。

那么,Boost.Python 是如何拥有 C++ 类的呢?

它是否将封装的 C++ 类实例作为 PyObject 的私有成员保存?包装类的所有继承、多态等特性是否都通过委托给持有的实例来模仿?

【问题讨论】:

【参考方案1】:

那么,Boost.Python 是如何持有 C++ 类的呢?

为了迂腐,在 C++ 中,在运行时没有类,只有类的对象或实例。

Boost 类包装器通过值或智能指针保存您的 C++ 对象(目前仅支持已弃用的 std::auto_ptr)。

不幸的是 boost.python 文档相当缺乏,这里有一些对你有用的链接:

http://www.boost.org/doc/libs/1_57_0/libs/python/test/select_holder.cpp http://www.boost.org/doc/libs/1_57_0/libs/python/test/auto_ptr.cpp http://www.boost.org/doc/libs/1_57_0/libs/python/doc/v2/faq.html#ownership

【讨论】:

“目前仅支持已弃用的 std::auto_ptr” — 2021 年仍然如此吗?

以上是关于Boost.Python 如何拥有 C++ 类?的主要内容,如果未能解决你的问题,请参考以下文章

使用boost.python,如何扩展类的__dir__函数?

扩展通过 Boost.Python 公开的虚拟 C++ 类

使用 Boost Python 从 c++ 类创建派生的 Python 类

修改 Boost Python 包装类?

Boost Python 暴露 C++ 类,构造函数采用 std::list

在 boost.python 中;如何公开包含在另一个类中的类(通过组合)?