本文へスキップ
BecomeCoder

C++コース · 第13章 テンプレート ― 型に依存しないコード · レッスン55

複数の型パラメータと型推論

ブラウザで完結

導入

テンプレートは型を2つ以上取れますし、既定値も持てます。また、関数テンプレートは引数から型を自動で判断(型推論)してくれます。実務でテンプレートを読むために必要な知識を仕上げます。

説明

template <typename K, typename V> のように、型パラメータを複数書けます。std::map<Key, Value>std::pair<A, B>(次章)がその例です。

flowchart TB
  p["template&lt;typename K, typename V&gt; struct Pair"]
  p -->|"Pair&lt;string, int&gt;"| a["K=string, V=int"]
  p -->|"Pair&lt;int, double&gt;"| 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)は、その名のとおりテンプレートの集大成です。vector map sort などを使うたびに、あなたはテンプレートを使っています。仕組みを知っておくと、エラーメッセージも読みやすくなります。

まとめ

型パラメータは複数持て(<K, V>)、関数テンプレートは引数から型を推論します。明示したいときは 関数<型>(...)。テンプレートは STL の土台であり、「型に依存しない汎用部品」を作るための C++ の中心的な機能です。

実際に動かしてみよう

下のエディタにC++を書いて「コンパイル & 実行」を押すと、ブラウザ内で本物のC++コンパイラ(clang + libc++)がその場でコンパイルして実行し、出力が表示されます。std::string・vector・クラス・テンプレート・STL などモダンC++がそのまま動きます。本文の例を書き換えて試しながら進めましょう(初回だけコンパイラの読み込みに時間がかかります。以降はキャッシュされます。この回は標準入力(cin)は使わず、値はコードに直接書きます)。

C/C++ — ブラウザ内で本物のコンパイラで実行

ブラウザ内で本物のC/C++コンパイラ(clang + libc++ / WebAssembly)を動かします。構造体・malloc/free・std::string・vector・クラス・テンプレート・STL などがそのまま実行できます(初回のみコンパイラの読み込みに時間がかかります。以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。