Программирование на C и C++

Онлайн справочник программиста на C и C++

Явная перегрузка функций-шаблонов

Хотя функция-шаблон перегружает себя по мере необходимости, также можно перегрузить ее явным образом. Если перегружается функция-шаблон, то перегруженная функция переопределя­ет функцию-шаблон для того конкретного набора типов параметров, для которого создается перегруженная функция. В качестве примера рассмотрим следующую версию функции swap():

// переопределение функции-шаблона
#include <iostream.h>
template <class X> void swap(X &a, X &b)
{
X temp;
temp = a;
a = b;
b = temp;
}
// обобщенная версия swap()
void swap(int &af int &b)
{
int temp;
temp = a;
a = b;
b = temp;
cout << "Inside overloaded swap(int &, int &).\n";
}
int main()
{
int i=10, j=20;
float x=10 .1, y=23.3;
char a='x', b='z';
cout << "Original i, j : " << i << ' ' << j << endl;
cout << "Original x, y: " << x << ' ' << у << endl;
cout << "Original a, b: " << a << ' ' << b << endl;
swap(i, j); // вызов явно перегруженной swap ()
swap(x, у); // обмен вещественных значений
swap(a, b); // обмен символов
cout << "Swapped i, j : " << i << ' ' << j << endl;
cout << "Swapped x, y: " << x << ' ' << у << endl;
cout << "Swapped a, b: " << a << ' ' << b << endl;
return 0;
}

При вызове функции swap (i, j) вызывается перегруженная явным образом версия swap(). Поэто­му компилятор не создает данной версии swap() функции, поскольку функция-шаблон переопре­делена с помощью явной перегрузки.

Показанная в этом примере ручная перегрузка функции-шаблона позволяет создавать версию функции в соответствии со специфической ситуацией. Однако в общем случае, если требуются различные версии функции для различных типов данных, то необходимо пользоваться перегруз­кой функции, а не шаблонами.