boost python - 如何将原始指针发送到python函数>

时间:2012-06-26 15:33:33

标签: c++ python pointers boost-python

我在我的应用程序中嵌入了python,我想向python函数发送一个原始指针,指向我在C ++代码中的对象。
我发现如何执行此操作的唯一方法是使用auto_ptrshared_ptr包装指针,但我不想这样做,因为我不希望python代码有任何保持的机会我代码中对象的引用。

这可以用boost :: python吗?

1 个答案:

答案 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?