This is from the xutility header of the C ++ Standard Library that ships with VS2012.
template<class _Elem1, class _Elem2> struct _Ptr_cat_helper {
In particular, what is the nature of the second _Ptr_cat_helper declaration? The angle brackets after the _Ptr_cat_helper declarator make it look like a specialization. But instead of specifying full or partial types by which the specialization of the template instead, just repeat the template argument several times.
I don’t think I have seen this before. What is it?
UPDATE
We are all clear that specialization applies to an instance of a template where both template arguments are of the same type, but I don’t understand whether this is a full or partial specialization or why.
I thought that specialization was a complete specialization, when all template arguments are either explicitly supplied or provided by default arguments, and are used in the same way as provided for creating a template instance, and, on the contrary, specialization was partial either if not all template parameters were necessary because of the specialization that provides one or more (but not all) of them, and / or if the template arguments were used in a form that was modified by the specialization template. For instance.
Specialization, which is partial, since specialization provides at least one, but not all, of the template arguments.
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; }};
Specialization, which is partial, because specialization leads to the fact that the argument of the provided template is used only partially.
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; }};
In this second example, if the template was created using A <char *>, then T in the template will actually be of type char, that is, the template argument, as indicated, is used only partially due to the use of the specialization template.
If this is correct, this will not make the template in the original question a full specialization, not a partial specialization, and if it is not, then where is my misunderstanding?