提升如何发送指向 Python 函数的原始指针>

boost how to send a raw pointer to a python function>

本文关键字:原始 指针 gt 函数 Python 何发送      更新时间:2023-10-16

我的应用程序中嵌入了python,我想向python函数发送一个原始指针,指向我在C++代码中的对象。
我找到的方法的唯一方法是用auto_ptrshared_ptr包裹指针,但我不想这样做,因为我不希望 python 代码有任何机会在我的代码中保存对对象的引用。

这可以通过boost::p ython吗?

如果你有指向某个C++对象的原始指针映射到Python,那么你可以使用适配器在原始指针周围创建另一个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 pointern")
    .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::p ython:如何调用需要指针的函数?