0

boost:variant を値として使用する汎用マップを作成しようとしています。適切な型を返す get(std::string key) 関数を記述しようとして困っています。

これが私がこれまでに思いついたものです:

 class GenericHashMap {
private:
std::map< std::string, boost::variant<int, bool, double, std::string> > genericMap;

public:
  template<typename T>
  bool getValue(const std::string & key, T & value) {
     if ( _map.find(key) == _map.end() ) {
        return false;
     }
     T * valuePtr = boost::get<T>(_map[key]);
     if (valuePtr == NULL) {
        return false;
     }
     value = *valuePtr;
     return true;
  }
}

イテレータをどのように処理すればよいですか? 独自のネストされたイテレータを作成する価値がありますか、それともネストされた std::map を返すだけですか。

編集

達成したいと思っていたクラス設計 (つまり、一般的なハッシュマップ) を追加しました。私が抱えていた問題は、特定のキーが特定のタイプとして格納されているかどうかをユーザーが照会する方法が必要だったことです。

4

1 に答える 1

1

このような問題がある場合は、バリアントから値を取得するのではなく、訪問者を使用する必要があることを意味します。これは通常、と一緒に行く方法boost::variantです。

あなたがそれについて考えるならば:あなたは特定のキー値のために特定のタイプを配線したくない。そうでなければ、それはあなたがのすべての力を失うことを意味しますboost::variant。また、キーセットごとに異なるマップを用意する必要があることを意味します(静的に知っているので、すべてを同じマップに配置しないでください)。

boost::variant静的な分岐ではなく、動的なディスパッチを支援するためにここにあります。

:この例では、アイテムが見つかったときに2回ルックアップします。アイテムfindを破棄するのではなく、の結果を保存して、2回目のルックアップを節約する必要があります。

于 2013-02-21T00:46:50.543 に答える