模板 class 专业化模板 class

Template class specialization with template class

相关问题:

考虑以下代码:

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

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

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

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

Class 模板偏特化语法与函数模板语法非常相似。实际上,class 模板偏特化的排序规则是基于函数模板偏序的。

编写一个带 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 的特化会尝试从某些类型参数 A 中推导出 vector<T> 中的 T,因此它们是写的一样。

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