Boost python,将原始指针与托管指针进行比较?

Posted

技术标签:

【中文标题】Boost python,将原始指针与托管指针进行比较?【英文标题】:Boost python, compare raw pointer to managed pointer? 【发布时间】:2012-05-16 04:52:24 【问题描述】:

所以我有一个std::map<KeyType, std::shared_ptr<ValueType>> 使用map_indexing_suite 暴露给python。

在代码的其他地方,我使用原始指针ValueType* 将对ValueType 对象的引用存储在映射中,因为这些容器不拥有ValueType 对象,而映射拥有。

我的问题是,如何将原始指针公开给 python,使其可以将该引用与共享指针进行比较?像这样的:

valueRef = getRawReference()
for x in myMap:
    if x.data() == valueRef:
        print "match"

【问题讨论】:

在 C++ 中,它将是 &** 将共享指针转换为对其指向的对象的引用。 & 将引用转换为它所引用的对象的地址。 【参考方案1】:

自己找到了答案。

先定义两个方法:

bool eq(std::shared_ptr<ValueType> lhs, ValueType* rhs)

    return lhs.get() == rhs;


bool neq(std::shared_ptr<ValueType> lhs, ValueType* rhs)

    return lhs.get() != rhs;

然后在您的 BOOST_PYTHON_MODULE 中:

bp::def("getRawReference", getRawReference, bp::return_value_policy<bp::reference_existing_object>())

bp::class_<ValueType, std::shared_ptr<ValueType>>("ValueType")
    .def("__eq__", eq)
    .def("__neq__", neq);

【讨论】:

__neq__ 应该是__ne__

以上是关于Boost python,将原始指针与托管指针进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

通过 Boost Python 在 C++ 对象之间传递共享指针的 Segfault

指向 boost::thread 的指针

动态数组和删除运算符的 boost::python 内存错误

将进程间管理的共享内存原始指针提升为类成员

boost的内存管理