Правила вызова шаблонной функции и перегрузка обычной функции

искусственный интеллект

Когда функция шаблона и обычная функция перегружены, компилятор C++ вызывает функцию следующим образом:

  1. Когда и шаблон функции, и обычная функция подходят для вызова, обычная функция предпочтительнее. Если вы хотите явно использовать шаблон функции, используйте список типов .
  2. Если шаблон функции дает лучшее совпадение, используйте шаблон функции.
  3. Шаблоны функций не допускают автоматического преобразования типов, а обычные функции могут выполнять преобразование тормозных типов.

Пример использования правила 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, поэтому сначала будут использоваться обычные функции.