Когда функция шаблона и обычная функция перегружены, компилятор C++ вызывает функцию следующим образом:
- Когда и шаблон функции, и обычная функция подходят для вызова, обычная функция предпочтительнее. Если вы хотите явно использовать шаблон функции, используйте список типов .
- Если шаблон функции дает лучшее совпадение, используйте шаблон функции.
- Шаблоны функций не допускают автоматического преобразования типов, а обычные функции могут выполнять преобразование тормозных типов.
Пример использования правила 1:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
int a = 1;
int b = 2;
cout << Max(a, b) << endl; // Когда и шаблон функции, и обычная функция встречаются с вызовом, обычная функция предпочтительнее
cout << Max<>(a, b) << endl; //Если отображается шаблон функции, используйте список типов
}
результат операции:
При первом вызове и шаблон функции, и обычная функция удовлетворяют условиям вызова, и обычная функция предпочтительнее.
При вызове во второй раз добавление после Max приведет к принудительному использованию шаблона функции, поэтому будет вызван шаблон функции.
Пример использования правила 2:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max(3.0, 4.0) << endl; //Если шаблон функции дает лучшее совпадение, используйте шаблон функции
cout << Max(5.0, 6.0, 7.0) << endl;//перегружаем
}
результат операции:
Будет потеря точности при преобразовании float в int, поэтому обычные функции не могут сопоставляться.В настоящее время можно выбирать только шаблоны функций.
Пример использования правила 3:
#include <iostream>
using namespace std;
int Max(int a, int b)
{
cout << "int Max(int a, int b)" << endl;
return a > b ? a :b;
}
template<typename T>
T Max(T a, T b)
{
cout << "T Max(T a,T b)" << endl;
return a > b ? a : b;
}
template<typename T>
T Max(T a, T b, T c)
{
cout << "T Mac(T a,T b,T c)" << endl;
return Max(Max(a, b), c);
}
int main()
{
cout << Max('a', 100) << endl; //Вызов обычных функций может быть неявно преобразован
}
результат операции:
'a' можно неявно преобразовать в значение int, соответствующее ASCII, поэтому сначала будут использоваться обычные функции.