2012-05-21 13 views
6

私は、Pythonになぜ私はブーストPythonベクトルインデックススイートで比較演算子が必要ですか?

std::vector<A> 

とC++のコードを公開したいと思います。私の

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を使用する方法はありますか?

答えて

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

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

+0

あなたの答えをありがとう!このコードはブーストサンドボックスでのみ利用できますか?それを使用する最も簡単な方法は何ですか? [サンドボックス](https://svn.boost.org/svn/boost/sandbox/python_indexing_v2/)でファイルを交換した後、手動でブーストをダウンロードしてコンパイルする必要はありますか? – Hans

+0

明らかに、この機能はBoost.Pythonのリリース版にはまだ含まれていないので、使用したい場合は、サンドボックスから最新バージョンをダウンロードして再構築する必要があります。しかし、私はこのバージョンの状態が何であるか分かりません(まだレビューされていません)ので、おそらく比較演算子のダミー実装に固執することです。 –

関連する問題