2017-01-05 50 views
7

相关问题:模板类专业化与模板类

考虑下面的代码:

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

第二个根本不合逻辑。 'template <>'意味着你明确地只专注于一种'T'类型。你正在做的是部分特化(你指定了T的无限子集,即只有那些满足'std :: vector '形式的子集) –

回答

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专业化会尝试从某些类型参数A中推导出的vector<T>,所以它们很有意义,它们是用相同的方式写的。

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