Что не было упомянуто, так это то, что функции шаблонов могут определять типы параметров.
template <typename T>
void func(T t)
{
T make_another = t;
Можно утверждать, что предстоящий оператор "typeof" может это исправить, но даже он не может разбить другие шаблоны:
template <typename T>
void func(container<T> c)
или даже:
template <tempate <typename> class Container, typename T>
void func(Container<T> ct)
Я также чувствую, что предмет специализации недостаточно освещен. Вот простой пример того, что макросы не могут сделать:
template <typename T>
T min(T a, T B)
{
return a < b ? a : b;
}
template <>
char* min(char* a, char* b)
{
if (strcmp(a, b) < 0)
return a;
else
return b;
}
Пространство слишком мало, чтобы заниматься специализацией типов, но то, что вы можете с ним сделать, насколько я понимаю, просто ошеломляет.