我在我的应用程序中嵌入了python,我想向python函数发送一个原始指针,指向我在C ++代码中的对象。
我发现如何执行此操作的唯一方法是使用auto_ptr
或shared_ptr
包装指针,但我不想这样做,因为我不希望python代码有任何保持的机会我代码中对象的引用。
这可以用boost :: python吗?
答案 0 :(得分:0)
如果你有一个映射到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?