Как сравнить объекты Python, которые заключают указатели в существующие структуры C ++? - PullRequest
3 голосов
/ 22 августа 2011

У меня есть метод класса, который возвращает указатель на внутреннюю структуру данных (где структура данных гарантированно изживет свое использование в коде Python). Похоже:

class MyClass {
    ...

    some_structure* get() {
        return inner_structure_;
    }

    private:
    some_structure* inner_structure_;
};

Я хочу обернуть этот get() метод в Boost :: Python, чтобы, если два разных объекта этого класса возвращали один и тот же указатель, связанные some_structure объекты в python сравнивались равными.

Внутри определения class_<MyClass> я пытался обернуть get() политиками вызовов return_value_policy<reference_existing_object>() и return_inner_reference<>(), но в обоих случаях вызов get() для различных объектов Python "MyClass" возвращает разные some_structure объекты, даже если все они указывают на один и тот же адрес памяти в C ++.

Как бы мне обойти это? Может ли быть скрытое свойство внутри объекта-обертки, в котором хранится адрес указателя, так что я могу вместо этого сравнить его?

1 Ответ

2 голосов
/ 27 августа 2011

Придумал способ сделать это, хотя он все еще кажется хакерским и что должен быть какой-то более легкий способ.Но вот что:

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>);
...