0

我在我的应用程序中嵌入了 python,我想向 python 函数发送一个原始指针,指向我在 C++ 代码中拥有的对象。
我发现如何做到这一点的唯一方法是用 anauto_ptr或 a包装指针,shared_ptr但我不想这样做,因为我不希望 python 代码有任何机会在我的代码中持有对对象的引用。

boost::python 有可能吗?

4

1 回答 1

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?

于 2014-01-15T17:21:57.983 回答