プログランミングにおける多重定義をオーバーロードと言う。
int f(int a, int b)
{
if (a > b)
return (a);
return (b);
}
float f(float a, float b)
{
if (a > b)
return (a);
return (b);
}
上記のように、同じ関数名で2つ以上の関数を宣言することはC言語ではできないが、C++ではできる。
関数に渡される引数のデータ型に応じて適切な関数が使われる。
コンパイラがコンパイル時に必要なオーバーロードを選択する。
しかし、多くのデータ型が存在しており、定義していないデータ型はサポートされない。(この場合、std::stringやboolなど)
そんな時に使いたいのが、template
template <typename T>
T f(T a, T b)
{
if (a > b)
return (a);
return (b);
}
上記のように定義すれば、関数の宣言時に引数、戻り値の型を適宜しなくてもよい。
ただし、aとbは同じデータ型でなくてはならない。
template <typename T, typename U>
T f(T a, U b)
{
if (a > b)
return (a);
return (b);
}
このように定義すれば、データ型が異なっていている引数を受け取ることができる。
このとき、TとUのデータ型は同じでも異なっていてもよい。
データ型によっては処理が不可能な場合もあり、その場合はコンパイル時にエラーになる。