我在我的应用程序中嵌入了 python,我想向 python 函数发送一个原始指针,指向我在 C++ 代码中拥有的对象。
我发现如何做到这一点的唯一方法是用 anauto_ptr
或 a包装指针,shared_ptr
但我不想这样做,因为我不希望 python 代码有任何机会在我的代码中持有对对象的引用。
boost::python 有可能吗?
我在我的应用程序中嵌入了 python,我想向 python 函数发送一个原始指针,指向我在 C++ 代码中拥有的对象。
我发现如何做到这一点的唯一方法是用 anauto_ptr
或 a包装指针,shared_ptr
但我不想这样做,因为我不希望 python 代码有任何机会在我的代码中持有对对象的引用。
boost::python 有可能吗?
如果您有指向映射到 Python 的某个 C++ 对象的原始指针,那么您可以使用适配器以这种方式围绕原始指针创建另一个 Python 对象:
template<typename PtrT>
struct PtrAdapter {
auto& get(PtrT ptr) { return *ptr; }
};
然后使其成为 Python 映射类型并允许隐式转换:
class_<Cluster<LinksT>*, noncopyable>(typpedName<LinksT>("ClusterPtr", true, true)
, "Raw hierarchy cluster pointer\n")
.def("__call__", &PtrAdapter<Cluster<LinksT>*>::get,
return_internal_reference<>(),
"referenced cluster")
;
register_ptr_to_python<Cluster<LinksT>*>();
请注意,引用类型(在这种情况下Cluster<LinksT>
)也必须映射到适当的 Python 对象。
然后对于这样的 C++ 代码:
Cluster<LinksT>* cl = clusters.head();
process(cl);
Id cid = cl->id();
您可以使用类似的 Python 代码:
cl = clusters.head()
process(cl)
cid = cl.id()
但是,如果您不需要对指向 C++ 对象的指针进行一些特殊处理boost::python::ptr
,那么使用.
您还应该考虑这里提到的替代方案:boost::python: howto call a function that expects a pointer?