プログランミングにおける多重定義をオーバーロードと言う。

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のデータ型は同じでも異なっていてもよい。

データ型によっては処理が不可能な場合もあり、その場合はコンパイル時にエラーになる。