C ++ hash_map,带有非专用模板作为值

时间:2013-02-28 16:57:45

标签: c++ templates hashmap

我希望有一个std::hash_map将常规std:string映射到另一个模板类的多个不同的专业

这个例子是我想要实现的(虽然这是错误的并且不能编译):

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

2 个答案:

答案 0 :(得分:9)

地图只能存储单个值类型,因此不能直接存储不同类型的对象;并且类模板的不同特化是不同的类型。

常见的解决方案是:

  • 存储指向多态基类型的指针,并通过虚函数或RTTI访问实数类型。您需要对管理对象本身有点小心 - 要么存储智能指针,要么将它们保存在其他一些数据结构中。
  • 存储受歧视的联合类型,例如boost::variantboost::any

答案 1 :(得分:2)

您通常不能在哈希中使用不完整类型的元素。你能创建一个其他人可以继承的非模板基类吗?

其原因很大程度上归结为编译器将如何解释您的请求。如果无法计算Foo结构的大小,则无法为hash_map创建内部。