Здесь много комментариев, пытающихся различить макросы и шаблоны.
Да - это одно и то же: инструменты генерации кода.
Макросы - это примитивная форма, без особого применения компилятором (например, выполнение объектов в C - это может быть сделано, но это не красиво). Шаблоны более продвинуты и имеют намного лучшую проверку типов компиляторов, сообщения об ошибках и т. Д.
Однако у каждого есть сильные стороны, которых нет у другого.
Шаблоны могут генерировать только динамические типы классов - макросы могут генерировать практически любой код, который вы хотите (кроме другого определения макроса). Макросы могут быть очень полезны для встраивания статических таблиц структурированных данных в ваш код.
Шаблоны, с другой стороны, могут выполнять действительно СМЕШНЫЕ вещи, которые невозможны с макросами. Например:
template<int d,int t> class Unit
{
double value;
public:
Unit(double n)
{
value = n;
}
Unit<d,t> operator+(Unit<d,t> n)
{
return Unit<d,t>(value + n.value);
}
Unit<d,t> operator-(Unit<d,t> n)
{
return Unit<d,t>(value - n.value);
}
Unit<d,t> operator*(double n)
{
return Unit<d,t>(value * n);
}
Unit<d,t> operator/(double n)
{
return Unit<d,t>(value / n);
}
Unit<d+d2,t+t2> operator*(Unit<d2,t2> n)
{
return Unit<d+d2,t+t2>(value + n.value);
}
Unit<d-d2,t-t2> operator/(Unit<d2,t2> n)
{
return Unit<d-d2,t-t2>(value + n.value);
}
etc....
};
#define Distance Unit<1,0>
#define Time Unit<0,1>
#define Second Time(1.0)
#define Meter Distance(1.0)
void foo()
{
Distance moved1 = 5 * Meter;
Distance moved2 = 10 * Meter;
Time time1 = 10 * Second;
Time time2 = 20 * Second;
if ((moved1 / time1) == (moved2 / time2))
printf("Same speed!");
}
Шаблон позволяет компилятору динамически создавать и использовать безопасные для типов экземпляры шаблона на лету. Во время компиляции компилятор фактически выполняет математику параметра-шаблона, создавая отдельные классы, где это необходимо для каждого уникального результата. Существует неявный тип Unit <1, -1> (расстояние / время = скорость), который создается и сравнивается в условном выражении, но никогда явно не объявляется в коде.
Очевидно, кто-то в университете определил шаблон такого типа с 40+ параметрами (нужен справочник), каждый из которых представляет отдельный тип физических единиц. Подумайте о безопасности типов такого класса, только для своих чисел.