Я думаю, что главной целью для специализации является определение «исключений», если вы хотите обрабатывать некоторые типы данных по-разному.
Рассматривая частичную специализацию, обратите внимание на следующее:
// NOT specialized
template <typename T>
struct test <T, T>
{
...
};
// partially specialized
template <typename T>
struct test <T*, T*>
{
...
};
Последний пример уже частично специализирован, потому что вы указываете компилятору ожидать любой тип указателя. И это может быть полезно, конечно, потому что вы можете захотеть обрабатывать типы указателей, немного отличающиеся от типов без указателей (например, проверка на NULL)
Я рекомендую прочитать эту статью