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

削除された内容 追加された内容
m 関連項目: テンプレートメタプログラミング
19行目:
cout << max(3, 7); //7が出力される
</source>
ここで、Tで表されているものを''テンプレート・パラメータ''という。
コンパイラは引数からmax(int, int)を呼び出すことを決め、Tをintとして''実体化''する。
コンパイラは実引数として与えられた値の型(''テンプレート引数''。この例の場合では、この整数型リテラルの型である 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を使用することはできない。困ったことにこの種のエラーでは難解なエラーメッセージが出力されてしまう。そのためテンプレートが関わるエラーを出さないよう仕様をよく確認する方が良い。