構造体名<テンプレート引数>テンプレートテンプレートは構造体や関数の「型」を一般化するための機能です。関数テンプレート関数テンプレートを用いることで「同様の処理を行うが、使用している型が異なる関数」をまとめることができます。これまで扱ってきたSTLのmin関数やmax関数は関数テンプレートを用いて定義されています。これによってint型に対してもdouble型に対しても同じように使えるようになっています。以下では「ある数値xを取って二乗する関数」を例として説明します。扱う数値がint型であれば次のように書くことができます。x;}ここでdouble型の数値を二乗する関数も必要になったとします。x;}これらの関数は次のように使うことができます。endl;}実行結果91.442つの関数(int用とdouble用)の関数内の記述は全く同じです。関数テンプレートの機能を用いることでこのような「別の型に対する同じ処理」をまとめることができます。具体的には次のように関数を定義します。x;}この関数を呼び出す側は以下のようになります。関数テンプレートを宣言するには次のようにします。処理内容}テンプレートは返り値の型や引数の型として用いることができます。複数のテンプレート引数を取ることもできます。処理内容}構造体のメンバ関数もテンプレートを用いて定義することができます。テンプレートを用いた関数の呼び出しテンプレートを用いて定義された関数を呼び出すには、以下のように書きます。...);テンプレート引数は、関数を定義したときに指定した分だけ渡します。...);ただし、引数の型から推定できる場合には、テンプレート引数の指定を省略することができます。double版のsquare関数の呼び出し}実行結果91.44構造体におけるテンプレート構造体を定義する際にもテンプレートを用いることができます。これによって、例えばメンバ変数の型を一般化した構造体を作ることができます。このようなテンプレートをクラステンプレートといいます。これまで扱ってきたvectorやmapなどのSTLのコンテナはクラステンプレートを用いて定義されています。vectorはvector<int>としてint型の配列を、vector<double>としてdouble型の配列を使うことができました。次のプログラムは座標値の型をテンプレートを用いて一般化したPoint構造体の例です。4.5)クラステンプレートの宣言クラステンプレートを宣言するには次のようにします。(構造体の内容)};テンプレート引数は型名として用いることができます。複数のテンプレート引数を取ることもできます。(構造体の内容)};テンプレートを用いた構造体の使用クラステンプレートを用いて定義した構造体を使うには、次のようにテンプレート引数を指定します。構造体名<テンプレート引数>上のサンプルプログラムではPointというクラステンプレートに対してPoint<int>やPoint<double>として利用しています。関数テンプレートと違い、クラステンプレートのテンプレート引数は省略することはできません。定数のテンプレート関数テンプレートもクラステンプレートも、整数型の定数をテンプレート引数として用いることができます。定数のテンプレートは、使う場所に応じて定数を切り替えたい場合などに便利です。具体例として、tupleの要素取得に用いるget関数や、bitsetは定数のテンプレートを用いて定義されています。以下は関数テンプレートにおいて定数のテンプレート引数をとる例です。1以下はクラステンプレートにおいて定数のテンプレート引数をとる例です。2}実行結果2注意点テンプレートを用いて宣言された関数や構造体にタイプミスなどのミスがあったとしても、それがプログラムの中で使われていない場合に、コンパイルエラーにならないことがあります。これは、使われていないテンプレートはコンパイル時に無視されるからです。詳しくは「細かい話の実体化について」を読んでください。以下は関数テンプレートの中でタイプミスをしている例です。fを呼び出すために用意された関数call_fですが、タイプミスで関数gを呼び出そうとしています。タイプミスしていますが、このテンプレートはプログラム中で使われていないため、正常にコンパイル・実行されます。次のように、call_fを使おうとしたときに初めてコンパイルエラーが発生します。‘g’「少しずつ書いてコンパイルして確認して......」というようなコーディングを行う場合には注意が必要です。細かい話テンプレートの実体化テンプレートは同じような処理を一般化できる便利な機能ですが、実は「関数・構造体を自動的に生成するための設計図」にすぎません。関数テンプレートは「それぞれの型専用の関数を自動的に生成するための機能」です。テンプレートを用いて定義された関数・構造体を使うときには、実際にはその実体(関数・構造体)が生成されてから使われることになります。このようにテンプレートから実体が作られることをテンプレートの実体化といいます。テンプレートの実体化はコンパイラによって自動的に行われます。あるテンプレートがプログラム中で全く使われていない場合には実体化は行われません。関数テンプレートの具体例として紹介したsquare関数を例として説明します。double版のsquare関数の呼び出し}実行結果91.44まず、squareの関数テンプレートを宣言しただけでは関数は何も生成されません。プログラム中でsquare<int>(a)のように使われることで、コンパイラによって「int用のsquare関数」(square_int関数と同等な関数)が生成されます。同様にsquare<double>(b)のように使われていると「double用の関数」(square_double関数と同等な関数)が作られます。square<int>(a)とsquare<double>(b)ではそれぞれが実体化されるので、プログラムが実行される際に実際に呼ばれている関数は別のものということになります。square<int>(2)とsquare<int>(3)のように同じint型に対する呼び出しについては、同じ関数がよばれることになります。square<int>(2)によってint型に対する実体化が行われ、square<int>(3)については既に実体化したものを呼び出す、とイメージするとよいでしょう。競技プログラミングでよく用いられる関数テンプレートとして、chmax/chminを紹介します。23chminは最小値を求める際に、chmaxは最大値を求める際などに用いると便利です。typenamとclassテンプレートの宣言におけるtypenameの部分はclassと書いても全く同じ意味になります。}};ここで紹介しなかった機能このページで紹介しなかったテンプレートに関する機能の例を載せておきます。深く知りたい人は是非調べてみてください。