「型を引数にする関数」がテンプレート。同じロジックを int / double / std::string など様々な型に対応させるために、関数を何度も書き直す必要がなくなります。std::max、std::sort、std::swap などすべてテンプレートで実装されています。
このページで押さえること
✅ 最低限ここだけ覚える
template<class T> を先頭に書く
型 T を関数内で自由に使える
呼び出すと型ごとに実体化される
実装はヘッダに書く(後述)
⭐ 余裕があれば読む
型推論 vs 明示指定
非型テンプレート引数(整数値など)
特殊化(特定の型だけ違う実装)
コンセプト (C++20)
1. まず触ってみる ― max のテンプレート化
C: 型ごとに書く冗長
intmax_int(int a, int b);
doublemax_double(double a, double b);
// ... 型ごとに全部書く必要// マクロで無理やり統一#define MAX(a, b) ((a) > (b) ? (a) : (b))
// 型安全でない、副作用がある、等
C++: テンプレート推奨
template<classT>
Tmax_v(T a, T b) {
return a > b ? a : b;
}
max_v(3, 5); // T = intmax_v(3.14, 2.71); // T = doublemax_v<std::string>("a", "b"); // T = std::string (明示)
▶ テンプレート実体化デモ
max_v();
ここまでで覚えること(3 つ):
template<class T> を関数の前に書く
関数内で T を任意の型として使える
呼び出すとコンパイラが使われた型で実体化する
2. テンプレートの実体化(インスタンシエーション)
テンプレートは関数の設計図。実際の関数はコンパイラが使われた型ごとに生成します。
実体化のイメージ概念
// あなたが書いたテンプレートtemplate<classT>
Tmax_v(T a, T b) { return a > b ? a : b; }
// コンパイラが生成するもの(概念):// max_v<int> を使うと…intmax_v(int a, int b) { return a > b ? a : b; }
// max_v<double> を使うと…doublemax_v(double a, double b) { return a > b ? a : b; }
// max_v<std::string> を使うと…std::stringmax_v(std::string a, std::string b) { return a > b ? a : b; }
template<classT, classU>
autoadd(T a, U b) -> decltype(a + b) {
return a + b;
}
add(1, 2.5); // T=int, U=double, 戻り値 double
4. 非型テンプレート引数
型だけでなく整数値もテンプレート引数にできます。配列サイズ等で便利。
N 個の平均非型引数
template<classT, size_tN>
Taverage(constT (&arr)[N]) {
T sum{};
for (size_t i = 0; i < N; ++i) sum += arr[i];
return sum / N;
}
int a[] = {1,2,3,4,5};
average(a); // N=5 が自動推論される