ここには、マクロとテンプレートを区別しようとするコメントがたくさんあります。
はい - どちらも同じものです: コード生成ツールです。
マクロはプリミティブな形式であり、コンパイラによる強制はあまりありません (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 以上のパラメータ (参照が必要) で定義しており、それぞれが異なる物理ユニット タイプを表しているようです。あなたの数字だけのために、その種のクラスの型安全性について考えてください。