相关问题:
请考虑以下代码:
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 { };
答案 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 <>
在这种特殊情况下会起什么作用。