4

std::hash_map(たとえば) 通常std:stringの s を別のテンプレート クラスの複数の異なる特殊化にマップする が必要です。

この例は、私が達成しようとしているものです (ただし、これは間違っており、コンパイルされません)。

template<typename T>
class Foo {
public:
  Foo(T _value)
  {
    this-> value = _value;
  }

private:
  T value;
};

int main() 
{
  hash_map<string, Foo> various_foos;
  various_foos["foo"] = Foo<int>(17);
  various_foos["bar"] = Foo<double>(17.4);
}
4

2 に答える 2

9

マップは単一の値型しか格納できないため、異なる型のオブジェクトを直接格納することはできません。クラステンプレートの異なる特殊化は異なるタイプです。

一般的な解決策は次のとおりです。

  • ポリモーフィックな基本型へのポインターを格納し、仮想関数または RTTI を介して実際の型にアクセスします。オブジェクト自体の管理には少し注意が必要です。スマート ポインターを格納するか、他のデータ構造に保持します。
  • boost::variantまたはなどの識別共用体型を格納します。boost::any
于 2013-02-28T17:02:42.293 に答える
2

通常、不完全なタイプの要素をハッシュに含めることはできません。他の人が継承できる非テンプレート基本クラスを作成できますか?

この理由は主に、コンパイラがリクエストをどのように解釈するかにかかっています。構造体のサイズを計算できない場合Foo、 の内部構造を作成できませんhash_map

于 2013-02-28T17:02:34.040 に答える