4

我想要一个std::hash_map将(例如)常规std:strings 映射到另一个模板类的多个不同专业化

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

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

map只能存储单一的值类型,所以不能直接存储不同类型的对象;并且类模板的不同特化是不同的类型。

常见的解决方案是:

  • 存储指向多态基类型的指针,并通过虚函数或 RTTI 访问真实类型。您需要小心管理对象本身 - 要么存储智能指针,要么将它们保存在其他一些数据结构中。
  • 存储有区别的联合类型,例如boost::variantboost::any
于 2013-02-28T17:02:42.293 回答
2

您的散列中通常不能有不完整类型的元素。你能做一个其他人可以继承的非模板基类吗?

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

于 2013-02-28T17:02:34.040 回答