本文へスキップ
BecomeCoder

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

関数テンプレート ― 型ごとに書かない

ブラウザで完結

導入

「int どうしの大きいほうを返す関数」「double 版」「string 版」を別々に書くのは無駄です。中身は同じなのに型だけ違う――そんなときは「テンプレート」で、型をパラメータにした1つの関数を書けます。STL もテンプレートの上に作られています。

説明

template <typename T> を付け、型の代わりに T を使います。呼び出し時に実際の型が当てはめられ、その型用の関数がコンパイラによって自動生成されます。

flowchart TB
  t["template&lt;typename T&gt; 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 と書いても同じ意味です。重複コードを一気に減らせる強力な道具です。

実際に動かしてみよう

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

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

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