Как первый аргумент в списке параметров шаблона получает пропущенные параметры вызова формы? - PullRequest
0 голосов
/ 26 июня 2018

Я экспериментировал, чтобы выяснить, как выводятся аргументы, когда мы используем шаблоны в c ++, но я пришел к случаю, который был для меня странным.

Согласно моему пониманию, параметры шаблона должны присутствовать в параметрах вызова.Но в приведенном ниже коде я попытался пропустить первый параметр шаблона, и код компилируется и работает нормально.Я думаю, у меня есть пробелы в моем понимании.

Это всего лишь экспериментальный код:

#include <iostream>
#include <cstring>
#include <string>
#include <typeinfo>
using namespace std;

template <typename T, typename T1>
T1 const& max (T1 const & a, T1 const & b) //"typename T" is not present here
{
    cout<<"inside func max a: "<<typeid(a).name()<<endl;
    cout<<"inside func max b: "<<typeid(b).name()<<endl;
return a < b ? b : a;
}

int main ()
{
  ::max<double>(7, 42);
  cout<<typeid(::max<double>(7, 42)).name();
}

Этот код работает нормально, без ошибок.Но как удалось пропустить параметр typename T .Может кто-нибудь объяснить, или дать ссылку на это.

1 Ответ

0 голосов
/ 26 июня 2018

как удалось пропустить имя типа T, параметр

T явно указан как doubleT1 может быть выведено из аргументов.

Чтобы создать экземпляр шаблона функции, каждый аргумент шаблона должен быть известен, но не каждый аргумент шаблона должен быть указан,Когда это возможно, компилятор будет выводить отсутствующие аргументы шаблона из аргументов функции.

Учитывая

::max<double>(7, 42); // T is specified as double, T1 is deduced as int from 7 and 42

Вы также можете указать T1, например

::max<double, long>(7, 42); // T is specified as double, T1 is specified as long
                            // then 7 and 42 will be converted to long when being passed

Обратите внимание, что только T1 может быть выведено (из аргументов);Вы должны всегда указывать T явно.

...