6

C++コードを公開したい

std::vector<A>

Pythonに。私の

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ますか?

4

1 に答える 1

5

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;
  };
}

これはここに文書化されています。

于 2012-05-21T09:09:43.097 に答える