2009-05-05 7 views
2

std::map<any, string>私はそこに別のアプローチがあるのだろうかと疑問に思っています にはアルバイトキーがありますか?std :: map(または類似のもの)でboost.anyをキーとして使用できますか?

+0

あなたは何をしたいですか? – Skurmedel

+5

anyキーはどこですか? – Artelius

+0

どのように私はstackoverflowの中でテンプレートパラメータを投稿できますか? – DaVinci

答えて

5

私は問題がBoost::Anyではなく、あなたがカスタムコンパレータを指定していないという事実ではないと思います。 mapはソートされた連想コンテナなので、コンパレータが必要です。

私のために、次の作品:それはあなたの目的に応じてオーダーメイド:

#include <iostream> 
#include <map> 
#include <boost/any.hpp> 

using namespace std;  
struct cmp { 
    bool operator()(const boost::any& l, const boost::any& r) { 
     try 
     { 
      int left = boost::any_cast<int>(l); 
      int right = boost::any_cast<int>(r); 
      return left < right; 
     } 
     catch(const boost::bad_any_cast &) 
     { 
      return false; 
     } 

     return false; 
    } 
}; 
int main() { 
    map<boost::any, string, cmp> ma; 
    boost::any to_append = 42; 
    ma.insert(std::make_pair(to_append, "int")); 
    if (ma.find(42) != ma.end()) { 
     cout << "hurray!\n"; 
    } 
    return 0; 
} 
+2

比較ファンクタはマップで使用するには無効です。一部の(a、b)ペアで

+0

例が良いでしょう。とにかく、私はコンパレータが失敗するところでもっと多くのケースが構築できると思います。タイプ間で順序付けを行うという非常に良い考えは、私にとっては良いことではありません。 – dirkgently

+0

例は、1つの(a)が含まれintで、もう1つの(b)が文字列を含む任意のペアです。あなたのコンパレータは、

1

あなたが使用しているすべてのタイプが同等であることを確認することができますので、あなたは、boost::variantはなくboost::anyで見たいと思うかもしれません。

訪問者を使用すると、variantの比較演算子を提供する最も良い方法になります。

関連する問題