模板类的模板类专业化

时间:2017-01-05 11:46:41

标签: c++ templates template-specialization

相关问题:

请考虑以下代码:

  template <typename T>
  struct is_std_vector: std::false_type { };

  template<typename ValueType>
  struct is_std_vector<std::vector<ValueType>>: std::true_type { };

为什么这样的模板类专业化语法正确? 以下似乎更符合逻辑:

  template <typename T>
  struct is_std_vector: std::false_type { };

  template<> //--- because it is is_std_vector specialization
  template<typename ValueType>
  struct is_std_vector<std::vector<ValueType>>: std::true_type { };

1 个答案:

答案 0 :(得分:0)

类模板部分特化语法紧密反映了函数模板语法。实际上,排序类模板部分特化的规则基于函数模板部分排序。

使用vector<T>编写函数的方式是:

template <class T>
void is_std_vector(vector<T> ) { ... }

所以你在vector<T>上写专业的方式是一样的:

template <class T>
class is_std_vector<vector<T>> { ... };

匹配is_std_vector的专精会尝试从某些类型参数T推断出vector<T>中的A,因此很有意义用同样的方式写的。

对于完全特化,我们使用template <>作为占位符信号,使完全特化看起来类似于部分特化。我不确定额外的template <>在这种特殊情况下会起什么作用。