Шаблоны функций C





шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

Трохи раніше була розглянута тема про перегрузке функций в C++ . Вы узнали о возможности написать несколько функций с одинаковым именем, которые выполняют одинаковые задачи. Основное отличие между ними – сигнатура (типи параметрів і / або кількість параметрів). При запуске программы, компилятор сам выберет, яку з перевантажених функцій застосувати (исходя из того, що передано в функцію)

Шаблоны так же позволяют функциям обрабатывать разные типы данных, передані у вигляді параметрів. Але при цьому досить написати одне загальне визначення функції. Смотрите как это выглядит.

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

Визначаючи шаблон функції ми використовували зарезервовані слова C ++: template і typename. template говорит о том, что сейчас будет определен шаблон. А в кутових дужках після typename дається умовне ім'я типу даних. Тут, вместо имени T, можно присвоить любое (очень желательно корректное) имя.

Далее определяется сама функция. Тип возвращаемого значения указываем T. Параметри: число типа T, и число типа int. Ця функція вважає відсоток від числа і повертає значення в програму. И число, и процент передаются как параметры. Наприклад першим параметром ми передамо в функцію ціле число (100). Під час запуску, компилятор отметит себе что T це int і замінить в шаблоні функції всі ці T на int. Таким образом для компилятора функция примет вид:

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

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

В итоге на экране увидим такой результат расчетов:шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

Говоря об определении шаблона функции, хочется добавить, що в кутові дужки після ключового слова template можливо записати кілька умовних імен для типів даних. Зачем это может понадобиться? Рассмотрим такой пример:

Необходимо написать функцию, которая примет два числа, определит максимальное из них и вернет его в программу. Будем иметь ввиду, що в функцію ми можемо передати числа різних типів. Можливий і випадок, что одно число будет целым, а второе – вещественным. Смотрите что произойдет:

Первый и второй параметры функции определены, как параметры типа T. С вызовами функции в строках 19-20 проблем не возникает, так как передаваемые параметры имеют одинаковый тип данных. Проблемы возникнут в строке 22 при компіляції. И это понятно. Компилятор запутается. Он не может преобразовать тип int в double.

шаблоны функций c++, шаблоны функций с++, template c++

Чтобы обойти эту проблему, надо написать другой шаблон.

Тут typename T_1 обозначает тип параметра, который передается в функцию первым. typename T_2 відповідно позначає тип другого параметра. Такой вариант определения шаблона функции предупредит ошибки, возникающие при передаче параметров разных типов.

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

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

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

призводить до наступних помилок:

шаблоны функций c++, шаблоны функций с++, template c++

В шаблоне мы определили условные им типов T_1 і T_2, а в сигнатурі прописали тільки тип T_1 .

На практике вы можете встретить определение шаблона функции таким способом, где вместо ключевого слова typename используется слово class. Наприклад:

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

воно рівнозначно тому визначенню, которое мы рассматривали

шаблони функцій c ++, шаблони функцій з ++, Шаблон C ++

Ранее, до выхода стандарта C 98, в шаблонах завжди використовували слово class. Сейчас же лучше, коли з'явилося ключове слово typename , лучше применять его. Так как оно более явно говорит о том, що імена T_1 і T_2 представляють тип.

Подведем итог. Шаблон функции предназначен для создания обобщенного описания функции. Такая функция сможет принять параметры любого типа. Шаблон дозволить компілятору генерувати код функції для конкретного типу (или типов) данных, который был передан в неё при вызове.

Обязательно посмотрите видео. О шаблонах с 14-й минуты:

Нові уроки:


Згоден отримувати повідомлення від purecodecpp.com на мій e-mail

дата
сторінка
Шаблоны функций C
рейтинг
5

14 думки про "Шаблоны функций C

  1. дивно, у мене якщо навіть визначити шаблон через T_1 програма працює коректно = про

  2. Таке питання, ось в прикладі, де функція приймає два аргументи з параметрами T1 і T2, у вас написано, що функція поверне більшого значення з типом T2, а якщо більше виявиться то, яке з параметром T1 ? буде неявне приведення до типу T2 з можливою втратою даних ??

    1. Да, в показаному прикладі повертається значення функції типу T1, і якщо повертається second типу T2, то буде неявне перетворення до T1.
      А що буде в результаті – це ви повинні самі передбачити … например, можете записати явне перетворення:

      return static_cast( second );

  3. чому так не можна?

    template
    Т_1 findMax(int a, подвійна б)
    {
    if (a > b)
    повертати;
    else if (b > a)
    повернення б;
    else
    return 0;
    }

  4. template
    Т_1 findMax(int a, подвійна б)
    {
    if (a > b)
    повертати;
    else if (b > a)
    повернення б;
    else
    return 0;
    }

  5. тобто так чому не можна?

    1. тому, що є правила синтаксису, і це просто не пройде синтаксичний контроль.
      А синтаксичні правила шаблонів говорять, що типи шаблону записуються в кутових дужках.

      1. Сайт з'їв частину коду, чому так не можна?

    1. Так не можна з багатьох причин:
      – згадуваний шаблонний тип повинен бути використаний в сигнатурі функції (така фраза є в тексті)
      – тому що повертати (return) різні типи вам дозволено тільки тому, що включається допустиме автоматичне перетворення – це погана практика…
      – краще при поверненні записати явне перетворення:

      – а ще краще:

      1. P.S. Да, движок форуму (Бувай?) з'їдає все, що в кутових дужках … тому я не можу вам правильно показати static_cast… , ну, в книжках подивіться.

  6. Зверніть увагу (це не акцентовано в тексті), що всі, що пов'язано з шаблонами (функций, классов) обробляється ** препроцесором **, засобами макрообработкі тексту – до початку самої компіляції С ++ всі шаблони розкриваються перетворенням коду.

залишити коментар

Код розміщуйте в тегах: <pre class="lang:C ++ декодуванням:true ">ВАШ КОД</заздалегідь>