導入
テンプレートは型を2つ以上取れますし、既定値も持てます。また、関数テンプレートは引数から型を自動で判断(型推論)してくれます。実務でテンプレートを読むために必要な知識を仕上げます。
説明
template <typename K, typename V> のように、型パラメータを複数書けます。std::map<Key, Value> や std::pair<A, B>(次章)がその例です。
flowchart TB p["template<typename K, typename V> struct Pair"] p -->|"Pair<string, int>"| a["K=string, V=int"] p -->|"Pair<int, double>"| b["K=int, V=double"]
#include <iostream>
#include <string>
using namespace std;
template <typename K, typename V>
struct Pair {
K key;
V value;
};
int main() {
Pair<string, int> age{ "たろう", 20 };
cout << age.key << ": " << age.value << endl; // たろう: 20
return 0;
}
関数テンプレートでは、引数から型を推論できるので <...> を省略できます。前レッスンで maxOf(3, 5) と書けたのはこのためです。一方で、型を明示したいときや推論できないときは 関数<型>(...) と書きます。
#include <iostream>
using namespace std;
template <typename T>
T half(T x) { return x / 2; }
int main() {
cout << half(10) << endl; // 5(int と推論 → 整数の割り算)
cout << half(10.0) << endl; // 5(double と推論)
cout << half<double>(10) << endl; // 5(型を明示 → double で計算)
return 0;
}
補足: C++ の標準ライブラリ(STL=Standard Template Library)は、その名のとおりテンプレートの集大成です。
vectormapsortなどを使うたびに、あなたはテンプレートを使っています。仕組みを知っておくと、エラーメッセージも読みやすくなります。
まとめ
型パラメータは複数持て(<K, V>)、関数テンプレートは引数から型を推論します。明示したいときは 関数<型>(...)。テンプレートは STL の土台であり、「型に依存しない汎用部品」を作るための C++ の中心的な機能です。