導入
「int どうしの大きいほうを返す関数」「double 版」「string 版」を別々に書くのは無駄です。中身は同じなのに型だけ違う――そんなときは「テンプレート」で、型をパラメータにした1つの関数を書けます。STL もテンプレートの上に作られています。
説明
template <typename T> を付け、型の代わりに T を使います。呼び出し時に実際の型が当てはめられ、その型用の関数がコンパイラによって自動生成されます。
flowchart TB t["template<typename T> T maxOf(T a, T b)"] t -->|"maxOf(3, 5)"| i["int 版が生成される"] t -->|"maxOf(2.5, 1.5)"| d["double 版が生成される"] t -->|"maxOf(sa, sb)"| s["string 版が生成される"]
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T maxOf(T a, T b) { // T は任意の型
return (a > b) ? a : b;
}
int main() {
cout << maxOf(3, 5) << endl; // 5(int 版)
cout << maxOf(2.5, 1.5) << endl; // 2.5(double 版)
cout << maxOf<string>("apple", "banana") << endl; // banana(string 版)
return 0;
}
T は1種類に限りません。複数の型パラメータも書けます。> a > b のように、T に対して使う演算(ここでは >)が、実際の型で使えることが条件になります。
#include <iostream>
using namespace std;
template <typename T>
void printPair(T a, T b) {
cout << a << " と " << b << endl;
}
int main() {
printPair(1, 2); // 1 と 2
printPair('x', 'y'); // x と y
return 0;
}
まとめ
template <typename T> を付けると、型に依存しない関数を1つ書くだけで、必要な型の版が自動生成されます。typename の代わりに class と書いても同じ意味です。重複コードを一気に減らせる強力な道具です。