提升如何发送指向 Python 函数的原始指针>
boost how to send a raw pointer to a python function>
我的应用程序中嵌入了python,我想向python函数发送一个原始指针,指向我在C++代码中的对象。
我找到的方法的唯一方法是用auto_ptr
或shared_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:如何调用需要指针的函数?
相关文章:
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- 为包含原始指针的对象C++智能指针
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- 将原始指针传递给接受unique_ptr作为参数的函数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 更改保留指向其字段的原始指针的对象地址
- 从原始指针(衰减的 C 样式数组)和大小生成范围::视图
- 如何在C++代码中灵活使用和替换标准::shared_ptr或标准::unique_ptr或原始指针?