С++. Параметры шаблонов функций.

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Эта тема — продолжение знакомства с шаблонами функций. В предыдущей теме Шаблоны функций в С++ для начинающих Первое знакомство был показан пример вывода наибольшего числа из двух с помощью шаблонной функции. Проблемным моментом в той функции был тип возвращаемого значения. Это просто логическое продолжение того материала.

Для начала листинг кода такой вот несложной функции

Этот код имеет 2 недостатка. Первый, наиболее очевидный, в том, что возвращаемое значение из функции max, может принимать оба типа. Какой она тип вернет зависит от порядка передаваемых в нее аргументов.

Думать о том, в каком порядке передавать аргументе — дело не благодарное. А в ином случае вот такие вот фокусы происходят.
Другая проблема не столь очевидная в том, что Т2 может неявно приводиться к Т1. Если немного подумать, можно легко понять, что функция возвращает тип Т1. А тип Т2 может не совпадать с типом Т1. Что если переменная типа Т2 больше чем переменная типа Т1 ? Возвращать надо Т2, но так типы не совпадают, происходит приведение типа из Т2 в Т1. Для этого приведения внутри функции создается внутренняя локальная переменная. Живет она внутри функции и умирает вместе с завершением работы функции. В свою очередь из-за этого нельзя вернуть результат по ссылке.

Такие вот недостатки у такого очевидного способа.
Один из вариантов обхода такого неудобства — это задавать дополнительный параметр вывода в шаблон.

Такой вот способ решения в лоб. Но здесь опять же имеет значение порядок передаваемых типов. Шаг влево, шаг вправо и програма ломается. Немного невнимательности и ищи, свищи проблему.
просто поменяйте местами типы в угловых скобках.
В общем так делать можно, но это требует особой внимательности и делать так достаточно утомительно.

Такая проблема тоже решаема. Решается она достаточно просто. Достаточно изменить порядок параметров, принятых шаблоном. И все будет намного удобнее.

Теперь все заработало. В угловых скобках мы явно указали тип данных, который ожидаем от функции, этот тип данных пришел в RT. Остальные типы пришли в T1 и в T2. Они туда ушли молча. Ушли в том порядке, в котором мы отдаем их вовнутрь функции. Так в первом случае (первой строчке) в T1 ушел тип из переменной N2 (int), в T2 тип N1 (double), а во втором случае T1 из N1(double),T2 из N2(int).

Согласитесь, что это намного удобнее чем думать о порядке типов и изменять весь этот порядок при необходимости.

  • Следует явно задавать все типы, которые нельзя определить неявно
  • В угловых скобках перед именем шаблонной функции указываются параметры шаблона, в круглых скобках после имени шаблонной функции указываются параметры вызова

Это все касается шаблонов функций. В шаблонах классов, например, можно использовать аргументы шаблона по умолчанию. Но, на этом закончим. Будем надеяться, что было полезно и интересно.

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     
Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

вакансия "Программист Психологической службы" - Алё! у нас ошибко! не работает тра-ля-ля - Вы хотите об этом поговорить? )))

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок