【发布时间】:2015-02-23 09:25:59
【问题描述】:
我想描述一下我最近遇到的情况,以便为这个问题提供一些背景信息。
我正在编写一个 Python C++ 包装器。 Python的基本单元是PyObject。 Python 中的每个实体都是一个 PyObject + 更多可选的东西。
也就是说第一个sizeofPyObject)字节保证会填满一个PyObject的字段,但是不同的对象可能会分配额外的连续内存。
这样做的好处(原因?)是任何东西都可以被类型转换回有意义的PyObject。
我正在尝试包装这样的野兽:
class CxxWrapper : PyObject {}
假设我创建了一个void foo(PyObject* p),并将foo 插入到 Python 运行时的函数指针表之一中。
然后运行时将触发此函数(无论出于何种原因),将指针传递给相关的PyObject。
我希望能够将其直接转换回其对应的 CxxWrapper 对象:
CxxWrapper* cxxw = static_cast<CxxWrapper>p;
但是,我看不出有任何方法可以让这种机制发挥作用。因为我看不到任何将基础对象设置为 PyObjectPlusExtra 的方法。
有没有办法做到这一点?如果没有,C++ 的限制是什么?
【问题讨论】:
-
你当然可以声明一些基类或第一个成员是PyObject的类,然后任何其他成员。
-
CxxWrapper* cxxw = static_cast<CxxWrapper*>(p); -
@JonathanPotter,但是 CxxWrapper 自己的构造函数没有机会构造派生对象。
-
cxxw是一个指针,它没有构造函数。 -
我的错,我应该解释一下 CxxWrapper 实际上是一个完整的 C++ 类,它有自己的数据。将其称为“包装器”具有误导性,抱歉。
标签: python c++ c++11 memory-management base-class