先頭へ戻る

テンプレート | Programming Place Plus 用語集

Programming Place Plus トップページ -- 用語集

先頭へ戻る

名称

このページでは、プログラミング言語の機能としての「テンプレート」を取り上げます。

解説

静的型付け言語において、を抽象化したソースコードを記述するための、プログラミング言語の機能の1つです。

テンプレートを備えているプログラミング言語には C++ やD言語があります。

静的型付け言語においては通常、変数や、関数仮引数戻り値の型を明示的に指定しなければなりません(型推論を使う場合を除く)。

int max(int a, int b)   // 大きいほうを返す
{
    return a >= b ? a : b;
}

しかし、意味としてはまったく同じで、型だけが異なるケースにおいては、同じコードを何度も記述しなければならなくなります。

int max(int a, int b)
{
    return a >= b ? a : b;
}

// double型のバージョンも欲しい
double max(double a, double b)
{
    return a >= b ? a : b;
}

テンプレートを用いると、型の部分を抽象化して、コードを共通化できます。たとえば C++ では次のように1つのコードにまとめられます。

template <typename T>    // テンプレートであることを示す記述
T max(T a, T b)          // 具体的な型の代わりに T を使う
{
    return a >= b ? a : b;
}

int のような具体的な型の指定が消え、代わりに T という名称に置き換えました。この T はテンプレート仮引数と呼ばれ、テンプレートになった関数を使用するコードを書くと、コンパイラによって、具体的な型の名前に置き換えられたコードが生成されます。

たとえば、max を呼び出すときに、T に当てはめるべき具体的な型を指定します。

int ans1 = max<int>(10, 20);
double ans2 = max<double>(10.15, 10.25);

// 実引数から型推論させることも可能
int ans3 = max(10, 20);    // 10 と 20 は int型だから、T は int型だと推測
auto ans4 = max(10, 20);   // 戻り値型も T だから int型だと分かる。よって、受け取り側の変数の型も型推論できる

使用時に記述する具体的な型名のほうをテンプレート実引数と呼びます。上記のコードのように、明示的に指定できるほか、(関数に渡すほうの)実引数から型推論させることも可能です。

こうしたコードから、テンプレート仮引数 T が int になったものと、double になったものがそれぞれ必要とされていることが分かるので、コンパイラはそれぞれのコードを生成します。

// T に int を当てはめたバージョン
int max(int a, int b)
{
    return a >= b ? a : b;
}

// T に double を当てはめたバージョン
double max(double a, double b)
{
    return a >= b ? a : b;
}

手動で2つの関数を書いたのと同じものが作り出されました。実際に呼び出されるコードは、この自動的に生成されたコードの方です。テンプレートはその名の通り、実際のコードを生成するための雛形に過ぎません。

関数に対してテンプレートの機能を適用したものを関数テンプレートと呼びます。このほか、クラスメンバの型を抽象化するクラステンプレートや、変数の型を抽象化する変数テンプレートがあります。

C++ の関数テンプレートについては C++編【言語解説】第9章、クラステンプレートは第20章で解説しています。

このように、型を抽象化しておこなうプログラミングの手法を、ジェネリックプログラミング(総称プログラミング)と呼びます。また、テンプレートの仕様をうまく活用して、計算処理の多くをコンパイルの時点で済ませてしまおうとする手法があり、テンプレートメタプログラミングと呼ばれています。


参考リンク

更新履歴


用語集のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー