C++/テンプレート

出典: フリー教科書『ウィキブックス(Wikibooks)』
< C++
ナビゲーションに移動 検索に移動

テンプレート[編集]

用途と概要[編集]

テンプレートはクラスと組み合わせて使うことが多い考え方です。しかし、ここでは関数に対するテンプレートを用いて、テンプレートを導入します。

テンプレートを使うと、関数を使う際、引数の型についての場合わけの手間を減らせる可能性があります。たとえば数値型と文字列型といった異なる型ごとに別々に関数を作らなくても済むようになります。

書式
template <typename 型名のような何か> ほぼ関数の定義文
※ 「ほぼ」については後述
コード例
#include <iostream>
#include <string> // 文字列を使うので忘れないように
using namespace std;

// ↓ これがテンプレートの定義
template <typename nanika> void tenpure(nanika a) {
  cout << a << endl; 
};
// ここまでテンプレートの定義

int main() {

  int e = 3;
  string f = "aaaa";

  tenpure(e);
  tenpure(f);
}

出力結果

3
aaaa

typename の部分は、予約語です。

「tenpure」(テンプレのローマ字読み)は単なる変数名ですので、自由に変えて構いません。

「nanika」の部分は、テンプレート名です。関数の定義文の引数の型が、この「nanika」に置き換わっている事に注目してください。テンプレート用の関数の定義文は、「ほぼ」通常の関数に似ていますが、引数の型が違っています。

利点

もしテンプレートを使わずに通常の関数だけで同じ結果の処理をやろうとすると、関数を2個、別々に作る必要があります。

ですが、テンプレートを使う事で、作成する関数は1つだけで済み、使い回しができます。

備考

テンプレートの宣言の際、

template <typename nanika> 
void tenpure(nanika a) {
  cout << a << endl; 
};

のように template <typename nanika> で改行して紹介する書籍などもよくあります。もともと1文で定義する命令ですので、間違えてセミコロンなどを改行位置で加えないように気をつけましょう。

詳細[編集]

テンプレートはパラメータとして型を与える機能です。例えば、同じ機能をint型、double型などに対して作成したい場合があります。この時には、型をパラメータとして与えることが出来ると便利です。テンプレートは、

template <typename T, ...> Tを用いた関数定義 という表記を用いることで定義することが出来ます。ここで、Tは区別するために用いられる型名で、どのような文字列を用いてもかまいません。テンプレートを用いて定義された関数を用いるには、

関数名 <型名, ...> (引数)

として呼び出すことが出来ます。型名は曖昧でなければ省略することが出来ます。

 template <typename T>
 T max (T a, T b){ return (a > b)?a :b ;}

これは、2つの数を与えて大きい方を取り出すための関数です。実際にこの関数を用いる時には、

 max (1,2);
 max (1.0, 3.0);
 max<double>(1,3.0); // 明示的に型を指定

などとします。

C言語では、これらの機能を実現する際にマクロを用いて、

 #define max(a, b) ((a > b)?(a) :(b))

とすることが通例でした。しかし、ここではaとbが異なる型を用いているときの扱いがテンプレートを用いている場合と比べてわかりづらくなります。そのため、C++では出来る限りテンプレートを使う方がよいでしょう。

関連分野[編集]

テンプレートに近い機能は最近のJavaでも導入されています。Javaでは、この機能はジェネリクスと呼ばれます。