В качестве примера случая, когда необходимо позволить пользователю задавать тип, определим шаблон функции sum()
Чтобы предоставить пользователю контроль над типом возвращаемого значения, определим третий параметр шаблона, представляющий тип возвращаемого значения:
// тип T1 не может быть выведен: он отсутствует в списке параметров
// функции
template
T1 sum(T2, T3);
В данном случае нет никакого аргумента, тип которого мог бы использоваться для выведения типа T1
sum()
вызывающая сторона должна предоставить Явный аргумент шаблона предоставляется вызову тем же способом, что и экземпляру шаблона класса. Явные аргументы шаблона определяются в угловых скобках после имени функции и перед списком аргументов:
//
auto val3 = sum
Этот вызов явно определяет тип параметра T1
T2
и T3
из типов переменных i
и lng
.Явные аргументы шаблона отвечают соответствующим параметрам шаблона слева направо; первый аргумент шаблона отвечает первому параметру шаблона, второй аргумент — второму параметру и т.д. Явный аргумент шаблона может быть пропущен только для замыкающих (крайних справа) параметров, и то, только если они могут быть выведены из параметров функции. Если функция sum()
//
//
template
T3 alternative_sum(T2, T1);
то пользователям придется всегда определять аргументы для всех трех параметров:
//
auto val3 = alternative_sum
//
auto val2 = alternative_sum
По тем же причинам, по которым нормальные преобразования разрешены для параметров, определенных с использованием обычных типов (см. раздел 16.2.1), нормальные преобразования применимы также для аргументов, параметры типа шаблона которых определяются явно:
long lng;
compare(lng, 1024); //
compare
compare
Как уже упоминалось, первый вызов ошибочен, поскольку у аргументов функции compare()
compare()
эквивалентен вызову функции, получающей два параметра const long&
. Параметр типа int
автоматически преобразуется в тип long
. Во втором вызове параметр Т
явно определяется как тип int
, таким образом, тип аргумента lng
преобразовывается в int
.Упражнение 16.37
. Библиотечная функцияmax()
имеет два параметра функции и возвращает больший из своих аргументов. У этой функции есть один параметр типа шаблона. Можно ли вызвать функцию max()
, передав ей аргументы типа int
и double
? Если да, то как? Если нет, то почему?Упражнение 16.38
. Когда происходит вызов функцииmake_shared()
(см. раздел 12.1.1), следует предоставить явный аргумент шаблона. Объясните, почему этот аргумент необходим и как он используется.Упражнение 16.39
. Используйте явный аргумент шаблона, чтобы сделать возможной передачу двух строковых литералов первоначальной версии функцииcompare()
из раздела 16.1.1.