Зачем мне нужны операторы сравнения в пакете векторной индексации Boost Python?

Я хотел бы показать код C ++ с

std::vector<A>

на питона. Мой

class A{};

@ не реализован оператор сравнения. Когда я пытаюсь

BOOST_PYTHON_MODULE(libmyvec)
{
  using namespace boost::python;
  class_<A>("A");
  class_<std::vector<A> >("Avec")
    .def(boost::python::vector_indexing_suite<std::vector<A> >());
}

Я получаю ошибку об операторах сравнения. Если я изменю определение A на

class A {
public:
  bool operator==(const A& other) {return false;}
  bool operator!=(const A& other) {return true;}
};

Работает как часы

Почему мне нужно реализовать эти операторы сравнения? Есть ли способ использоватьvector_indexing_suite без них

Ответы на вопрос(1)

Решение Вопроса

vector_indexing_suite реализует__contains__ункция-член, которая требует наличия оператора равенства. Как следствие, ваш тип должен предоставлять такой оператор.

Версия Boost.Python для песочницы решает эту проблему, используя черты, чтобы определить, какие операции доступны в контейнерах. Например,find будет предоставлено только в том случае, если значения сравнимы по равенству.

По умолчанию Boost.Python считает, что все значения сравнимы по равенству и сопоставимы по величине. Так как ваш тип не соответствует этим требованиям, вам нужно специализировать черты, чтобы указать, какие операции он поддерживает:

namespace indexing {
  template<>
  struct value_traits<A> : public value_traits<int>
  {
    static bool const equality_comparable = false;
    static bool const lessthan_comparable = false;
  };
}

Это задокументированоВо.

 Hans21 мая 2012 г., 14:36
Спасибо за Ваш ответ! Этот код доступен только в буст-песочнице? Какой самый простой способ его использовать? Нужно ли загружать и компилировать boost вручную после обмена файлами в Песочница?
 Luc Touraille21 мая 2012 г., 15:00
По всей видимости, эта функция еще не включена в релизную версию Boost.Python, поэтому, если вы хотите ее использовать, вам придется скачать последнюю версию из песочницы и пересобрать ее. Однако я не знаю, каков статус этой версии (она еще не пересмотрена), поэтому лучше всего придерживаться фиктивной реализации операторов сравнения.

Ваш ответ на вопрос