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)
类模板部分特化语法与函数模板语法密切相关。事实上,类模板部分特化的排序规则是基于函数模板部分排序的。
编写采用 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 <>在这种特殊情况下额外的用途是什么。