C++ プログラミングガイド

関数テンプレート

関数テンプレートは、引数または戻り値の型だけが異なった、関連する複数の関数を記述したものです。

C++ 5.0 では、関数テンプレートにテンプレートの型名でないパラメータを使用することはできません 。

関数テンプレートの宣言

テンプレートは使用する前に宣言しなければなりません。次の例に見られるように、 「宣言」によってテンプレートを使用するのに十分な情報は与えられますが、テンプレートの実装には他の情報も必要です。


template <class Number> Number twice( Number original );

この例では Number は「テンプレートパラメータ」であり、テンプレートが記述する関数の範囲を指定します。具体的に言えば、Number は「テンプレート型パラメータ」であり、テンプレート宣言と定義の中で使用されている場合、指定したいテンプレートの型を意味しています。

関数テンプレートの定義

テンプレートは宣言と定義の両方が必要になります。テンプレートを「定義」することで実装に必要な情報が得られます。次の例は、前述の例で宣言されたテンプレートを定義しています。


template <class Number> Number twice( Number original )
    { return original + original; }

テンプレート定義は通常ヘッダーファイルで行われるので、テンプレート定義が複数のコンパイル単位で繰り返される可能性があります。しかし、すべての定義は同じでなければなりません。この制限は「単一定義ルール」と呼ばれます。

C++ 5.0 では、関数テンプレートには型名ではないテンプレートパラメータは使用できません。たとえば、次のテンプレートは、その引数が型ではなく式であるため使用できません。


template <int count> void foo( )  // パラメータが型名ではないので無効
{
    int x[count]supported non-type parameter
    for (int i = 0; i < count; ++i ) 
        // ... x により何かを行う
}

foo<10>(); // テンプレート引数 10 により foo を呼び出そうとするが、無効

関数テンプレートの使用

テンプレートは、いったん宣言すると他のすべての関数と同様に使用することができます。テンプレートを「使用」するには、そのテンプレートの名前とテンプレート引数を指定します。コンパイラは、テンプレート型引数を、関数引数の型から推測します。たとえば、以前に宣言されたテンプレートを次のように使用できます。


double twicedouble( double item )
    { return twice( item ); }