模板类与模板类的专用化

Template class specialization with template class

本文关键字:专用      更新时间:2023-10-16

相关问题:

  • 具有模板类的 C++ 嵌套模板专用化
  • 使用模板类
  • 参数的模板类专用化

请考虑以下代码:

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

类模板部分专用化语法与函数模板语法非常相似。实际上,对类模板部分专用化进行排序的规则基于函数模板部分排序。

编写采用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中推断出T vector<T>,因此它们以相同的方式编写是很有意义的。

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