関数テンプレート は、関数のグループの生成方法を定義します。
非テンプレート関数は、テンプレートから生成された特殊化の関数と同じ名前、 およびパラメーター・プロファイルを持っていたとしても、 非テンプレート関数は、関数テンプレートとは関連がありません。 非テンプレート関数は、関数テンプレートの特殊化と見なされることは、ありません。
次の例は、quicksort という名前の関数テンプレートを使用した、QuickSort アルゴリズムをインプリメントします。
#include <iostream> #include <cstdlib> using namespace std; template<class T> void quicksort(T a[], const int& leftarg, const int& rightarg) { if (leftarg < rightarg) { T pivotvalue = a[leftarg]; int left = leftarg - 1; int right = rightarg + 1; for(;;) { while (a[--right] > pivotvalue); while (a[++left] < pivotvalue); if (left >= right) break; T temp = a[right]; a[right] = a[left]; a[left] = temp; } int pivot = right; quicksort(a, leftarg, pivot); quicksort(a, pivot + 1, rightarg); } } int main(void) { int sortme[10]; for (int i = 0; i < 10; i++) { sortme[i] = rand(); cout << sortme[i] << " "; }; cout << endl; quicksort<int>(sortme, 0, 10 - 1); for (int i = 0; i < 10; i++) cout << sortme[i] << " "; cout << endl; return 0; }
上記の例は、次に類似する出力を行います。
16838 5758 10113 17515 31051 5627 23010 7419 16212 4086 4086 5627 5758 7419 10113 16212 16838 17515 23010 31051
QuickSort アルゴリズムは、型 T の配列 (これの関係演算子および代入演算子は、定義されている) をソートします。 テンプレート関数は、1 つのテンプレート引き数と 3 つの関数引き数を取ります。
上記の例では、次のステートメントを使用して、quicksort() テンプレート関数を呼び出すこともできます。
quicksort(sortme, 0, 10 - 1);
コンパイラーが、テンプレート関数呼び出しの使い方とコンテキストにより、テンプレート引き数を推定できる場合、テンプレート引き数を省略できます。 ここでは、コンパイラーは、sortme が、型 int の配列であると推定します。
関連参照