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

削除された内容 追加された内容
→‎技術的側面: 文章を微調整。
5行目:
 
== 技術的側面 ==
テンプレートには''関数テンプレート''と''クラステンプレート''がある。関数テンプレートは自由な型の引数を受け取ることができる関数のようなものである。たとえば、[[標準C++ライブラリ]]にある関数テンプレートmax(x, y)はxとyのうち、大きな方を返す関数テンプレートで、次のように定義できる。
<source lang="cpp">
template <typename T>
20行目:
cout << max(3, 7); //7が出力される
</source>
ここで、Tで表されているものを''テンプレート仮引数'' (''template parameter'') という。コンパイラは実引数として与えられた値の型(''テンプレート実引数''、''template argument''。この例の場合では、この整数型リテラルの型であるint)からTに対応する型を''導出''し、Tに得られたintを当てはめて関数を''実体化''する。このようにして実体化された関数を''特殊化''(あるいは特殊化版、特殊バージョン)という。例のmax(3, 7)に対してはこの特殊化が呼ばれることになる。なお、実体化のことを''具現化''と呼ぶこともある。
 
この場合xとyがどんな型でも「x < y」という式が生成される。またユーザー定義型の場合も、<演算子が適切に多重定義されていればその型に対してmaxが使える。同様の例は他にもあり、STLには適切な演算子が定義されていれば利用可能になるという関数テンプレートが数多く存在する。例えば<演算子が定義されていれば、sort(), stable_sort(), binary_search()や配列から[[ヒープ]]構造を作成するアルゴリズム、setなどのコンテナなどが利用可能になる。
 
逆に標準ライブラリにある[[複素数]]を表す型のcomplexには<演算子が定義されていない。複素数には強い順序付けが存在しないからである。そのためmax(x, y)という呼出はxとyが複素数の場合コンパイルエラーになる。このように<演算子を必要とするテンプレートでcomplexを使用することはできない。困ったことにこの種のエラーでは難解なエラーメッセージが出力されてしまう。そのためテンプレートが関わるエラーを出さないように、利用する関数テンプレートの仕様をあらかじめよく確認する方が良い。
 
一般的に、そのようなテンプレート実引数に対する要求は、コンセプト (concept) や要件 (requirement) などとして別途文書によって記述されている。標準C++ライブラリのstd::max関数テンプレート (X3014 25.3.7) では、そのテンプレート実引数が''LessThanComparable''でなければならないと定められている。ある型がLessThanComparableであるためには、正にa < bという演算ができなければならない (X3014 20.1.2) と定めれているのである。
 
クラステンプレートはテンプレートをクラスに当てはめたものである。汎用的なコンテナの作成によく用いられる。たとえばSTLにはリンクリストとしてlistが存在する。整数のリストを作りたければlist<int>と書き、文字列のリストを作りたければlist<string>と書けばよい。