2010-12-03 8 views

答えて

1

おそらく、コンパレータをマップに渡すことができます。コンパレータの書き込み方法の例については、http://www.sgi.com/tech/stl/Map.htmlを参照してください。

5

BOOSTを適用するエラーを修正するために編集:: APPLY_VISITOR

あなたのバリアントのバイナリ訪問者を作成し、ブーストを使用することができます::あなたのマップのコンパレータを作成するためのapply_visitor:

class variant_less_than 
    : public boost::static_visitor<bool> 
{ 
public: 

    template <typename T, typename U> 
    bool operator()(const T & lhs, const U & rhs) const 
    { 
      // compare different types 
    } 

    template <typename T> 
    bool operator()(const T & lhs, const T & rhs) const 
    { 
      // compare types that are the same 
    } 

}; 

おそらくテンプレートのoperator(const T &, const U &)を使用してapposedにタイプの可能なペアごとにoperator()をオーバーロードする必要があります。そして、あなたはこのようなあなたのマップを宣言する必要があるだろう:

class real_less_than 
{ 
public: 
    template<typename T> 
    bool operator()(const T &lhs, const T &rhs) 
    { 
    return boost::apply_visitor(variant_less_than(), lhs, rhs); 
    } 
}; 

std::map<boost::variant<T, U, V>, ValueType, real_less_than> myMap; 

編集:それは次のように定義されていますが、それは価値がある何のために、operator<()boost::variantのために定義されています

bool operator<(const variant &rhs) const 
{ 
    if(which() == rhs.which()) 
    // compare contents 
    else 
    return which() < rhs.which(); 
} 

私は仮定しているではありませんあなたが欲しいもの。

+0

ありがとうございます。 boost :: variant <>ではなく、boost :: make_recursive_variant <>で定義されているように、私のバリアントでoperator()が機能しませんでした。 通常のboost :: variant <> – user222202

+0

@ user222202からコードをコピーします。私の編集。 mapのテンプレートリストでboost :: apply_visitorを呼び出すことはできません。ビジターを適用する関数オブジェクトを作成する必要があります。 –

関連する問題