模板类的模板类专业化

Rom*_*biy 7 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 { };
Run Code Online (Sandbox Code Playgroud)

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

  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 { };
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 0

类模板部分特化语法与函数模板语法密切相关。事实上,类模板部分特化的排序规则是基于函数模板部分排序的。

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

template <class T>
void is_std_vector(vector<T> ) { ... }
Run Code Online (Sandbox Code Playgroud)

因此,您编写专业化的方式vector<T>是相同的:

template <class T>
class is_std_vector<vector<T>> { ... };
Run Code Online (Sandbox Code Playgroud)

匹配 的专业化会尝试从某种类型参数中is_std_vector推导出来,因此它们以相同的方式编写是很有意义的。Tvector<T>A

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