Допускается перегрузка шаблонов функций как шаблонами, так и обычными функциями (см. п. п. 14.5.5.1 в [1]), например:
template<typename Т> inline
Т const& max(T const& х, Т const& у) { return (х > у)?х:у; } template<typename Т> inline
Т const& max(T const& х, Т const& у, const Т& z)
{ return max(max(x,у),z); }
char *max(const char *x, const char *y)
{ return (strcmp(x.y) > 0>?x:y; }
double& max(const double& x, const double& y)
{ return (x > y)?x:y; }
// шаблон 1
// шаблон 2
// функция
// функция
Как и при перегрузке обычных функций, шаблоны (и функции) должны различаться списками параметров. Компилятор при обработке конкретного вызова старается подобрать наиболее подходящий вариант, например:
char *sl = "0123456789", *s2 ="1234567890": float a = 1.0. b = 2.0:
cout << max(l,2) << endl: // шаблон 1
cout << max(l.0,2.0) << endl: // функция с аргументами типа double
cout << max(l.0,2.0, 3.0) << endl; // шаблон 2
cout << max(l,2.0) << endl; // функция с аргументами типа double
cout << max(a,b) << endl; // шаблон 1
cout << max(sl,s2) << endl; // функция с аргументами типа char*
Мы можем «заставить» компилятор вызвать шаблон с аргументами типа char*. Для этого просто нужно записать угловые скобки в вызове, например:
cout << max<>(sl,s2) << endl; // шаблон 1 с аргументами типа char*
Однако следует отдавать себе отчет, что в этом случае сравниваются не строки, а указатели! |