【问题标题】:Typedef a template class without specifying the template parameterstypedef 一个模板类而不指定模板参数
【发布时间】:2010-12-01 06:12:15
【问题描述】:

我正在尝试键入 unordered_map 或 std::map,具体取决于是否有可用的 TR1 库。但我不想指定模板参数。从我到目前为止所读到的,在官方 c++0x 标准可用之前,没有参数的 typedef'ing 模板是不可能的。那么有人知道一个优雅的解决方法吗?

#ifdef _TR1
#include <unordered_map> 
typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments
#else
#include <map> 
typedef std::map MyMap; //error C2976: too few template arguments
#endif

【问题讨论】:

标签: c++ templates c++11 typedef tr1


【解决方案1】:

我看到的方法是将 typedef 包装在模板结构中:

template<typename KeyType, typename MappedType>
struct myMap
{
#ifdef _TR1
    typedef std::tr1::unordered_map<KeyType, MappedType> type;
#else
    typedef std::map<KeyType, MappedType> type;
#endif
};

然后在您的代码中像这样调用它:

myMap<key, value>::type myMapInstance;

它可能比你想要的更冗长,但我相信它满足了当前 C++ 状态的需要。

【讨论】:

  • 这确实是模拟 C++ 中缺少模板类型定义的常用方法。但是,我会将 typedef 命名为“类型”而不是“值”,这在语义上似乎更正确,也更惯用。
【解决方案2】:

您必须对 typedef 使用完整类型。

改用#define 宏。

【讨论】:

  • 有时最好还是使用旧方法。最好的管道胶带编程。
  • 不幸的是宏不尊重范围。
猜你喜欢
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多