67356

Перевантаження шаблонної функції

Лекция

Информатика, кибернетика и программирование

Окрім створення безпосередньо перевизначених версій узагальненої функції, можна також перевизначати саму специфікацію шаблону функції. Для цього достатньо створити ще одну версію шаблону, яка відрізнятиметься від інших переліком параметрів. Розглянемо такий приклад...

Украинкский

2014-09-07

70 KB

1 чел.

Лекція № 20

Тема: Перевантаження шаблонної функції

План

  1.  Механізм перевантаження специфікації шаблону функції
  2.  Використання стандартних параметрів у шаблонних функціях
  3.  Обмеження, які застосовуються при використанні узагальнених функцій
  4.  Приклад створення узагальненої функції abs()

  1.   Механізм перевантаження специфікації шаблону функції

   Окрім створення безпосередньо перевизначених версій узагальненої функції, можна також перевизначати саму специфікацію шаблону функції. Для цього достатньо створити ще одну версію шаблону, яка відрізнятиметься від інших переліком параметрів. Розглянемо такий приклад.

Приклад. Демонстрація механізму перевизначення специфікації шаблону функції

    // Перша версія шаблону Fun().

template <class aType> void Fun(aType a)

{     cout << "Виконується функція Fun(aType a)" << endl;

}

    // Друга версія шаблону Fun().

template <class aType, class bType> void Fun(aType a, bType b)

{     cout << "Виконується функція Fun(aType a, bType b)" << endl;

}

void main()

{     Fun(10);            // Викликається функція Fun(a).

      Fun(10, 20);           // Викликається функція Fun(a, b).

}

   У цьому коді програми шаблон для функції Fun() перевизначається, щоб забезпечити можливість прийняття як одного, так і двох параметрів.

  1.   Використання стандартних параметрів у шаблонних функціях

   У шаблонних функціях можна змішувати стандартні параметри з узагальненими параметрами типу. Ці параметри працюють так само, як і у будь-якій іншій функції. Розглянемо такий приклад.

Приклад. Демонстрація механізму використання стандартних параметрів у шаблонній

                 функції

   // Відображення даних задану кількість разів.

template<class aType> void repeat(aType data, int times)

{    int tim = times;

     do

     {     cout << tim – times + 1 << " ==> " << data << endl;

            times--;

      } while(times);

      cout << endl;

}

void main()

{    repeat("Це тест.", 3);

     repeat(100, 5);

     repeat(99.0/2, 4);

}

    Ось які результати генерує ця програма.

1 ==> Це тест.

2 ==> Це тест.

3 ==> Це тест.

1 ==> 100

2 ==> 100

3 ==> 100

4 ==> 100

5 ==> 100

1 ==> 49.5

2 ==> 49.5

3 ==> 49.5

4 ==> 49.5

 

    У цьому коді програми функція repeat() відображає свій перший аргумент стільки раз, скільки задано її другим аргументом. Оскільки перший аргумент має узагальнений тип, то функцію repeat() можна використовувати для відображення даних будь-якого типу. Параметр times – стандартний, він передається за значенням. Змішане задавання узагальнених і стандартних параметрів, як правило, не викликає жодних проблем їх реалізації, застосовується найчастіше у програмуванні.

  1.   Обмеження, які застосовуються при використанні узагальнених функцій

    Узагальнені функції подібні до перевизначених функцій, але мають більше обмежень з їх застосування. При перевизначенні функцій в тілі кожної з них зазвичай записують різні дії. Але узагальнена функція повинна виконувати одні і ті самі дії для всіх її версій; відмінність між версіями полягає тільки в типі оброблюваних даних. Розглянемо приклад, у якому перевизначені функції не можна замінити узагальненою функцією, оскільки вони виконують різні дії:

void outdata(int i)

{    cout << i << endl;

}

void outdata(double d)

{    cout << d * 3.1416 << endl;

}

  1.   Приклад створення узагальненої функції abs()

    Функція abs() -  функція, яка повертає абсолютне значення заданого аргументу. Оскільки процедура повернення абсолютного значення числа однакова для всіх типів числових значень, то функція abs() може слугувати типовим прикладом для створення шаблонної функції.

    За наявності узагальненої версії функції abs() компілятор зможе автоматично створювати необхідну її версію. Програміст у цьому випадку звільняється від написання окремих версій для кожного типу даних.

    

Приклад. Демонстрація механізму створення узагальненої версії функції, яка повертає  

                 абсолютне значення числа

 

template <class aType> aType myAbs(aType n)

{    return n < 0 ? -n : n;

}

void main()

{    cout << myAbs(-10) << endl;            // Для типу int

     cout << myAbs(-10.0) << endl;        // Для типу double

     cout << myAbs(-10L) << endl;         // Для типу long

     cout << myAbs(-10.0F) << endl;      // Для типу float

}

Головне тут те, що один і той самий алгоритм повинен застосовуватися до широкого діапазону типу даних.


 

А также другие работы, которые могут Вас заинтересовать

24428. Классификации сайтов. Сервисы Интернет 40.5 KB
  Сервисы Интернет. Классификация сайтов Все многообразие информации в интернете обозначаемой одним емким словом сайт можно условно разделить по: задачам сайта цели его создания и фунционирования коммерческий некоммерческий информационный рекламный поисковая система. объемности хоумпейдж сайтывизитки интернетпредставительства вебпорталы и т. Интернет сервисы: Пользователь работающий в Интернет имеет дело с несколькими различными видами услуг.
24429. Концепция и возможности XML-технологий 67 KB
  Концепция и возможности XMLтехнологий. XML Extensible Markup Language[1] это язык разметки описывающий объектов данных называемых XML документами. сам по себе XML не содержит никаких тэгов предназначенных для разметки он просто определяет порядок их создания. Таким образом если например мы считаем что для обозначения элемента rose в документе необходимо использовать тэг flower ; то XML позволяет свободно использовать определяемый нами тэг и мы можем включать в документ фрагменты подобные следующему: flower rose flower Набор...
24430. Архитектура стека TCP/IP. Протокол IP. Заголовок IP-пакета. IP-адресация 238.5 KB
  Заголовок IPпакета. В его задачу входит продвижение пакета между сетями от одного маршрутизатора до другого до тех пор пока пакет не попадет в сеть назначения. Заголовок IPпакета IPпакет состоит из заголовка и поля данных. Значение длины заголовка IPпакета также занимает 4 бита и измеряется в 32 битовых словах.
24431. Протокол ARP. Протокол ICMP. Протокол UDP 124 KB
  Протокол ARP. Протокол ARP: Для определения локального адреса MAC по IPадресу используется протокол разрешения адресов Address Resolution Protocol ARP. Существует два варианта работы APR: локальная сеть с поддержкой широковещания глобальная сеть без широковещения Рассмотрим работу протокола ARP в локальных сетях с широковещанием. Для решения этой задачи протокол IP обращается к протоколу ARP.
24432. Протокол TCP. Формат заголовка TCP 135.5 KB
  Протокол TCP. Формат заголовка TCP. TCP Transmission Control Protocol гарантированный протокол транспортного уровня с предварительным установлением соединения предоставляющий приложению надёжный поток данных дающий уверенность в безошибочности получаемых данных перезапрашивающий данные в случае потери и устраняющий дублирование данных. Протокол TCP взаимодействует через межуровневые интерфейсы с ниже лежащим протоколом IP и с выше лежащими протоколами прикладного уровня или приложениями.
24433. Принципы одноадресной маршрутизации. Структура и типы записей таблицы маршрутизации. Протоколы маршрутизации 72 KB
  Принципы одноадресной маршрутизации. Структура и типы записей таблицы маршрутизации. Протоколы маршрутизации. Полученная в результате анализа информация о маршрутах дальнейшего следования пакетов помещается в таблицу маршрутизации.
24434. Функционирование NAT. Функционирование Proxy 999 KB
  Диаграммы рисуют для визуализации системы с разных точек зрения. Теоретически диаграммы могут содержать любые комбинации сущностей и отношений. Всего UML предлагает девять дополняющих друг друга диаграмм входящих в различные модели: диаграммы вариантов использования; диаграммы классов; диаграммы пакетов: диаграммы последовательностей действий; диаграммы кооперации: диаграммы деятельностей: диаграммы состояний объектов: диаграммы компонентов: диаграммы размещения. Диаграммы вариантов использования.
24435. Служба DNS. Иерархические доменные имена. Полномочные серверы DNS 107.5 KB
  Служба DNS. Полномочные серверы DNS. Служба DNS Широковещательный способ установления соответствия между символьными именами и локальными адресами хорошо работает только в небольшой локальной сети не разделенной на подсети. Таким решением стала централизованная служба DNS Domain Name System система доменных имен основанная на распределенной базе отображений доменное имя IPадрес.
24436. Назначение и возможности макросредств в ассемблере 146 KB
  Он вставляет вместо вызова команды которые соответствуют макросу. Макроопределение группа команд определяющая действие макрокоманды. При описании макрокоманды используется оператор MACRO. Макрокоманды позволяют сократить размер выполняемой программы за счет описания повторяющихся участков однажды.