Шаблонная специализация предназначена для тех случаев, когда вы хотите сделать что-то особенное для определенных параметров шаблона. Компилятор создаст экземпляр всего, что не указано в исходном шаблоне.
Это полезно, когда требуется другое поведение для определенного типа данных, но также может использоваться для более сложного сопоставления с образцом, например, для изменения поведения для типов указателей или const
типов:
template <typename T>
struct is_pointer { static bool value = false; };
template <typename T>
struct is_pointer<T*> { static bool value = true; };
template <typename T>
struct is_const { static bool value = false; };
template <typename T>
struct is_const<const T> { static bool value = true; };
// later, try this:
assert(is_pointer<int*>::value == true);
assert(is_pointer<int>::value == false);
Итак, короткая история: не утруждайте себя указанием вашего шаблона, если у вас нет ничего особенного, связанного с определенным параметром, который вы не можете обобщить в базовый шаблон. Специализация шаблонов - это довольно жесткая форма сопоставления с образцом, которую можно использовать как для добра, так и для зла.