「テンプレート (プログラミング)」の版間の差分

削除された内容 追加された内容
テンプレートに対するコンセプト・要件
実体化と具現化
1行目:
[[プログラミング (コンピュータ)|プログラミング]]における'''テンプレート'''は、静的型付けの[[C++]]で[[データ型]]にとらわれずにコードを書くことを可能にする機能であり、C++においては[[ジェネリックプログラミング]]に用いられる。
 
C++においてテンプレートは[[多重継承]]や[[演算子多重定義]]と並ぶ重要な機能となった。STL ([[Standard Template Library]])はテンプレートによって構築されたフレームワークとなっている。
 
== 技術的側面 ==
テンプレートには''関数テンプレート''と''クラステンプレート''がある。関数テンプレートは自由な型の引数を受け取ることができる関数のようなものである。たとえば、[[標準C++標準ライブラリ]]にある関数テンプレートmax(x, y)はxとyの内、大きな方を返す関数テンプレートで、次のように定義できる。
<source lang="cpp">
template <typename T>
19行目:
cout << max(3, 7); //7が出力される
</source>
ここで、Tで表されているものを''テンプレート仮引数'' (''template parameter'')という。コンパイラは実引数として与えられた値の型(''テンプレート実引数''、''template argument''。この例の場合では、この整数リテラルの型である int)からTに対応する型を''導出''し、Tに得られたintを当てはめて関数を''実体化''する。このようにして実体化された関数を''実体特殊化''もしく(あるい''具現特殊'' (''template instantiation'')版、特殊バージョン)という。例の max(3, 7) に対してはこの実体特殊化がコールさ呼ばれることになる。なお、実体化のことを''具現化''と呼ぶこともある。
 
この場合xとyがどんな型でも「x < y」という式が生成される。またユーザー定義型の場合も、<演算子が適切に多重定義されていればその型に対してmaxが使える。同様の例は他にもあり、STLには適切な演算子が定義されていれば利用可能になるという関数テンプレートが数多く存在する。例えば<演算子が定義されていれば、sort(), stable_sort(), binary_search()や配列から[[ヒープ]]構造を作成するアルゴリズム、setなどのコンテナなどが利用可能になる。
25行目:
逆に標準ライブラリにある[[複素数]]を表す型のcomplexには<演算子が定義されていない。複素数には強い順序付けが存在しないからである。そのためmax(x, y)という呼出はxとyが複素数の場合コンパイルエラーになる。このように<演算子を必要とするテンプレートでcomplexを使用することはできない。困ったことにこの種のエラーでは難解なエラーメッセージが出力されてしまう。そのためテンプレートが関わるエラーを出さないよう仕様をよく確認する方が良い。
 
一般的に、そのようなテンプレート実引数に対する要求は、コンセプト (concept)や要件 (requirement)などとして別途文書によって記述されている。[[標準C++ライブラリ]]にも上記と同じようなmax関数テンプレートが存在する (X3014 25.3.7)では、そのテンプレート実引数''LessThanComparable''でなければならないと定められている。ある型がLessThanComparableであるためには、正にa < bという演算ができなければならない (X3014 20.1.2)と定めれているのである。
 
クラステンプレートはテンプレートをクラスに当てはめたものである。汎用的なコンテナの作成によく用いられる。たとえばSTLにはリンクリストとしてlistが存在する。整数のリストを作りたければlist<int>と書き、文字列のリストを作りたければlist<string>と書けばよい。
34行目:
#define max(a, b) ((a) < (b) ? (b) : (a))
</source>
マクロでもテンプレートでもコンパイル時までに展開される。マクロは常にインラインに展開されるが、関数テンプレートではコンパイラの判断によってインライン関数として扱われる。そのため(関数テンプレートがインライン展開される限り)実行時のオーバーヘッドは両者共に発生しない。
 
しかしテンプレートはマクロに比べ型安全であるという点で大きな違いがある。関数形式のマクロでよく起こるエラーをテンプレートでは回避できる。そしてマクロのおそらく重大な欠点として1論理行に収めなければならないということがあり、規模の大きいマクロは書くのが面倒ということがある。