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

削除された内容 追加された内容
編集の要約なし
編集の要約なし
4行目:
C++においてテンプレートは[[多重継承]]や[[多重定義#演算子オーバーロード|演算子多重定義]]と並ぶ重要な機能となった。STL ([[Standard Template Library]]) はテンプレートによって構築された汎用的なアルゴリズムやデータ構造を含む[[アプリケーションフレームワーク|フレームワーク]]となっている。
 
== 技術的側面C++ ==
=== 概要 ===
テンプレートには'''[[サブルーチン#関数|関数]]テンプレート'''と'''[[クラス (コンピュータ)|クラス]]テンプレート'''がある。関数テンプレートは任意の型の[[引数]]を受け取ることができる関数のようなものである。たとえば、[[標準C++ライブラリ]]にある関数テンプレート<code>max(x, y)</code>は引数<code>x</code>と<code>y</code>のうち、大きな方を返す関数テンプレートで、次のように定義できる。
<source lang="cpp">
19 ⟶ 20行目:
<source lang="cpp">
using namespace std;
cout << max<int>(3, 7) << endl; // 7が出力される
cout << max(3, 7) << endl; // 7が出力される
cout << max<double>(-3.1, -8) << endl; // -3.1が出力される。
cout << max(-3.1, -8.0) << endl; // -3.1が出力される。
cout << max(-3.1, -8) << endl; // 曖昧さが解決できないためコンパイルエラー。
</source>
ここで、テンプレート内にて<code>T</code>で表されているものを'''テンプレート[[仮引数]]''' (''template parameter'') という。テンプレート自身は実体をもたないため、利用する際は'''実体化''' (instantiate) する必要がある。実体化の方法のひとつとして、<code>max&lt;int&gt;</code>のように具体的な型すなわち'''テンプレート[[実引数]]''' (''template argument'') を明示的に指定することができるが、曖昧さがない場合に限り、[[コンパイラ]]は関数テンプレートの[[実引数]]として与えられた値の型(この例の場合では、<code>x</code>および<code>y</code>として渡された[[整数型]][[リテラル]]の型である<code>int</code>)から<code>T</code>に対応する型を'''推論'''し、得られた具体的な型<code>int</code>を<code>T</code>に当てはめて関数を暗黙的に実体化することもできる。このようにして実体化された関数を'''特殊化'''(あるいは特殊化版、特殊バージョン)という。例の<code>max&lt;int&gt;(3, 7)</code>, <code>max(3, 7)</code>に対しては<code>int</code>の特殊化が、<code>max&lt;double&gt;(-3.1, -8)</code>, <code>max(-3.1, -8.0)</code>に対しては<code>double</code>の特殊化が呼ばれることになる。なお、実体化のことを'''具現化'''と呼ぶこともある。
 
この場合<code>x</code>と<code>y</code>がどんな型でも'''<code>x &lt; y</code>'''という式が生成される。またユーザー定義型の場合も、<code>&lt;</code>演算子が適切に多重定義されていればその型に対して<code>max</code>が使える。同様の例は他にもあり、STLには適切な演算子が定義されていれば利用可能になるという関数テンプレートが数多く存在する。例えば<code>&lt;</code>演算子が定義されていれば、<code>sort()</code>, <code>stable_sort()</code>, <code>binary_search()</code>や、配列から[[ヒープ]]構造を作成するアルゴリズム、<code>set</code>などのコンテナなどが利用可能になる。関数テンプレートには述語 (predicate) として[[関数オブジェクト]]を受け取るものも存在し、ソートの比較などに使われる[[コールバック関数]]をカスタマイズすることが容易になっている。
34 ⟶ 38行目:
テンプレート引数の数はC++03までは固定であり、定義時にひとつひとつ明示的に指定する必要があったが、[[C++11]]では可変引数テンプレート (variadic template) がサポートされるようになった。[[可変長引数]]の関数やマクロのように、<code>...</code>という記法を用いて記述する。
 
=== 利点と欠点 ===
テンプレートの用法の中には[[C言語]]の[[プリプロセッサ|プリプロセッサマクロ]]で代替できるものがある。例えば<code>max</code>関数テンプレートの代替として、次のように<code>MAX</code>マクロを定義できる。
<source lang="c">