这是来自 VS2012 附带的 C++ 标准库 xutility 头文件。
template<class _Elem1,
class _Elem2>
struct _Ptr_cat_helper
{ // determines pointer category, nonscalar by default
typedef _Nonscalar_ptr_iterator_tag type;
};
template<class _Elem>
struct _Ptr_cat_helper<_Elem, _Elem>
{ // determines pointer category, common type
typedef typename _If<is_scalar<_Elem>::value,
_Scalar_ptr_iterator_tag,
_Nonscalar_ptr_iterator_tag>::type type;
};
具体来说,第二个 _Ptr_cat_helper 声明的性质是什么?声明符 _Ptr_cat_helper 后面的尖括号使它看起来像一个特化。但是,它没有指定专门化模板的全部或部分类型,而是多次重复模板参数。
我想我以前没见过。它是什么?
更新
我们都清楚,特化适用于模板的实例化,其中两个模板参数属于同一类型,但我不清楚这是否构成完全或部分特化,或者为什么。
我认为当所有模板参数都是显式提供或由默认参数提供时,特化是完全特化,并且完全按照提供的方式用于实例化模板,相反,如果不是所有模板参数,特化也是部分的由于提供一个或多个(但不是全部)的专业化,和/或如果模板参数以由专业化模式修改的形式使用,则需要。例如
一种部分的特化,因为特化提供了至少一个,但不是全部的模板参数。
template<typename T, typename U>
class G { public: T Foo(T a, U b){ return a + b; }};
template<typename T>
class G<T, bool> { public: T Foo(T a, bool b){ return b ? ++a : a; }};
部分特化,因为特化导致提供的模板参数仅部分使用。
template<typename T>
class F { public: T Foo(T a){ return ++a; }};
template<typename T>
class F<T*> { public: T Foo(T* a){ return ++*a; }};
在第二个示例中,如果模板是使用 A<char*> 实例化的,则模板中的 T 实际上是 char 类型,即提供的模板参数仅部分使用,因为应用了专门化模式。
如果这是正确的,那么这不会使原始问题中的模板成为完全专业化而不是部分专业化,如果不是这样,那么我的误解在哪里?