「テンプレート (プログラミング)」の版間の差分
削除された内容 追加された内容
m →関連項目: {{C++}} |
マークアップ, 内部リンク |
||
2行目:
[[プログラミング (コンピュータ)|プログラミング]]における'''テンプレート'''は、静的型付けの[[C++]]で[[データ型]]にとらわれずにコードを書くことを可能にする機能であり、C++においては[[ジェネリックプログラミング]]に用いられる。
C++においてテンプレートは[[多重継承]]や[[多重定義#演算子オーバーロード|演算子多重定義]]と並ぶ重要な機能となった。STL ([[Standard Template Library]])はテンプレートによって構築された[[アプリケーションフレームワーク|フレームワーク]]となっている。
== 技術的側面 ==
テンプレートには''[[サブルーチン#関数|関数]]テンプレート''と''[[クラス (コンピュータ)|クラス]]テンプレート''がある。関数テンプレートは自由な型の[[引数]]を受け取ることができる関数のようなものである。たとえば、[[標準C++ライブラリ]]にある関数テンプレート<code>max(x, y)</code>は<code>x</code>と<code>y</code>のうち、大きな方を返す関数テンプレートで、次のように定義できる。
<source lang="cpp">
template <typename T>
20行目:
cout << max(3, 7); //7が出力される
</source>
ここで、<code>T</code>で表されているものを''テンプレート[[仮引数]]'' (''template parameter'') という。[[コンパイラ]]は[[実引数]]として与えられた値の型(''テンプレート実引数''、''template argument''。この例の場合では、この[[整数型]][[リテラル]]の型である
この場合<code>x</code>と<code>y</code>がどんな型でも
逆に標準ライブラリにある[[複素数]]を表す型の<code>complex</code>には<code><</code>演算子が定義されていない。複素数には強い順序付けが存在しないからである。そのため<code>max(x, y)</code>という呼出は<code>x</code>と<code>y</code>が複素数の場合コンパイルエラーになる。このように<code><</code>演算子を必要とするテンプレートで<code>complex</code>を使用することはできない。困ったことにこの種のエラーでは難解なエラーメッセージが出力されてしまう。そのためテンプレートが関わるエラーを出さないように、利用する関数テンプレートの仕様をあらかじめよく確認する方が良い。
一般的に、そのようなテンプレート実引数に対する要求は、コンセプト (concept) や要件 (requirement) などとして別途文書によって記述されている。標準C++ライブラリの<code>std::max</code>関数テンプレート (X3014 25.3.7) では、そのテンプレート実引数が''LessThanComparable''でなければならないと定められている。ある型がLessThanComparableであるためには、正に<code>a
クラステンプレートはテンプレートをクラスに当てはめたものである。汎用的なコンテナの作成によく用いられる。たとえばSTLには[[連結リスト|リンクリスト]]として<code>list</code>が存在する。整数のリストを作りたければ
== 利点と欠点 ==
テンプレートの用法の中には[[プリプロセッサ|プリプロセッサマクロ]]で代替できるものがある。<code>max</code>もそれにあたり、次のように<code>max</code>マクロを定義できる。
<source lang="c">
#define max(a, b) ((a) < (b) ? (b) : (a))
</source>
マクロ
しかしテンプレートはマクロに比べて[[型安全]]であるという点で大きな違いがある。関数形式のマクロでよく起こるエラーをテンプレートでは回避できる。そしてマクロのおそらく重大な欠点として1論理行に収めなければならないという
一方、テンプレートには大きく
== 他言語 ==
|