指定したコードを初めて見たのは1年ほど前だ。書けるというのは知らなかったし、最初その意味がさっぱり分からなかった。なんとかそれを理解したはずだったのだが、1年たって上記コードを見ると、その意味をすっかり忘れていた自分がそこにいた。orz意味を忘れたということは、ちゃんと理解していなかったのかもしれない。そこで、今度こそ忘れないようにと文書化しておくことにする。テンプレートのおさらいまずはテンプレートの基本を抑えておく。以下の構文でテンプレート関数・クラスを定義することができる。ある例は2つの引数の最大値を返すテンプレート関数だ。関数をコールすることが可能になる。MyClass(またはそれに変換可能クラス)次にテンプレートクラスの例も見ておく。テンプレート引数は2つあり、最初はコンテナに格納するデータの型。2番目はデータ領域をアロケートするためのクラスだ。allocator)を指定してあるので、省略することができる。v;利用時は上図のよう利用する。囲って型を明示的に指定する。利用時に型を明示的または暗に指定して特殊化した関数・クラスを実体化することができる。柔軟かつ効率的なライブラリが定義できるというわけだ。関数コールを行った時点で初めてコードが生成されることに注意して欲しい。テンプレートクラスの場合はメンバ関数(コンストラクタも含む)が呼ばれた時点で初めてコードが生成される。コードが生成されることを実体化と呼ぶ。テンプレート関数・クラス定義に於いて参照可能である。テンプレート関数・クラスを利用するときに明示的または暗に型が指定されテンプレート引数の値が確定する。これは通常の関数定義・関数コールと事情はまったく同じである。指定されている場合の話。例をもう一度以下に示しておく。宣言されているだけで、定義されていないことがわかる。引数をひとつ取るテンプレートクラスということをコンパイラに伝えているだけなのだ。関数の場合でも、以下のように関数を定義せずに、宣言だけを行うことができる。テンプレートクラスで、テンプレート引数をひとつ取る、ということだ。実は関数宣言で仮引数名を省略できるのと同じで、テンプレート引数名は省略できる。先の例は以下のように記述してもよい。余計な情報が無いコードの方が理解しやすいと思う。ひとつのテンプレート引数を取るテンプレートクラスだからだ。それは意図的にクラスの自由度を減らし、安全性を高めるだめだと考えられる。自分で作成したコンテナを引数で指定できるようになる。型に限定したいとする。以外の型指定をして欲しくないことになる。好ましくない動作は行うことができないようにするのが正しい設計方針だ。して利用するテンプレート引数にテンプレートクラスを指定することにより型を限定することができる。