如何比较将指针包装到现有C ++结构的python对象?

时间:2011-08-22 19:31:44

标签: boost-python

我有一个类方法,它返回一个指向内部数据结构的指针(其中数据结构保证在python代码中的使用寿命更长)。它看起来像:

class MyClass {
    ...

    some_structure* get() {
        return inner_structure_;
    }

    private:
    some_structure* inner_structure_;
};

我想在Boost :: Python中包装这个get()方法,这样如果这个类的两个不同对象返回相同的指针,python中相关的some_structure对象就比较等了。

class_<MyClass>定义中,我尝试使用get()return_value_policy<reference_existing_object>()调用策略包装return_inner_reference<>(),但在这两种情况下,请在不同的情况下调用get() python“MyClass”对象返回不同的some_structure对象,即使它们都指向C ++中的相同内存地址。

我如何解决这个问题?包装器对象中可能有一个隐藏属性存储指针的地址,所以我可以比较它们吗?

1 个答案:

答案 0 :(得分:2)

找到了一种方法,虽然它仍然感觉很乱,并且应该有一些更简单的方法。但是这里有:

1)定义自己的比较指针的方法。

template <typename T>
bool eq(const T* self, const T* rhs) {                
  return self == rhs;                                                           
}                                                                               

template <typename T>                                                           
bool ne(const T* self, const T* rhs) {                
  return !eq<T>(self, rhs);                                              
}

2)手动声明包装类中的__eq____ne__指向这些方法:

class_<smth>("smth", no_init)
  ...
  .def("__eq__", &eq<smth>)
  .def("__ne__", &ne<smth>);