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

}

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


 

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

28951. Борьба политический партий за власть, большевистский государственный переворот 31.5 KB
  Следствием кризиса был Корниловский мятеж в результате которого все большую популярность получили большевики был окончательно потерян авторитет ВП. ЦИК советов и ИСКД создали чрезвычайный орган Комитет народной борьбы с контрреволюцией в который входили меньшевики эсеры и большевики. В это время большевики активизировали работу в советах стали восстанавливать отряды Красной гвардии направили своих агитаторов в корниловские войска Донскую Уссурийскую и Дикую дивизии. Укрепили свои позиции большевики возросло их влияние в народе.
28952. Возникновение советской государственности. Политика «военного коммунизма» 46.5 KB
  С приходом большевиков к власти возможность расширения правительства за счет вхождения в него других социалистических партий не была утеряна. В рядах партии имелась влиятельная группа большевиков которая отстаивала эту позицию. На заседании ЦК большевиков 1 ноября эта линия была расценена как капитулянтская переговоры были свернуты а Каменев снят с поста председателя ВЦИКа. в него было избрано 715 из800 депутатов: 370 эсеров 175 большевиков 40 левых эсеров 17 кадетов 15 меньшевиков 86 представителей национальных партий.
28953. Гражданская война и военная интервенция в России, причины и последствия 33.5 KB
  Предпосылки и причины гражданской войны После Октябрьской революции сложилась напряжённая социалполитическая ситуация Приступая к грандиозному преобразованию России большевики нуждались в спокойствии на внешних границах. Внутренняя обстановка в России была не менее напряжённой. Вводилось единое для всего населения России наименование гражданин Российской республики.
28954. Теория и практика национальной политики большевиков. Образование СССР 47 KB
  Неустойчивость международного положения молодых советских республик в условиях капиталистического окружения также диктовала потребность в объединении. Значение этого разделения возросло после окончания Гражданской войны когда встала задача восстановления разрушенного хозяйства и преодоления экономической отсталости советских республик. сложился военнополитический союз советских республик. был подписан декрет Об объединении советских республик России Украины Латвии Литвы Белоруссии для борьбы с мировым империализмом.
28955. Новая экономическая политика и ее сущность 34 KB
  Нэп допускал некоторое развитие капиталистических элементов при сохранении командных высот народного хозяйства в руках государства диктатуры пролетариата; обеспечивал подъём производительных сил на базе роста социалистических и вытеснения капиталистических элементов преобразование многоукладной экономики в единую социалистическую на основе индустриализации страны и кооперирования сельского хозяйства. Нарушение в этот период экономических связей промышленности с сельское хозяйством через торговлю сокращение товарооборота подрывали...
28956. Курс большевистской партии на строительство социализма в одной стране. Индустриализация и коллективизация сельского хозяйства и их последствия 43.5 KB
  Предпосылки индустриализации. Техникоэкономическая отсталость могла стать хронической и перейти в историческую  необходимость индустриализации. Необходимость индустриализации. Социальная без индустриализации невозможно развитие экономики а следовательно и социальной сферы: образования здравоохранения сферы отдыха социального обеспечения.
28957. Формирование тоталитарно-бюрократического режима в СССР. Становление режима личной власти Сталина 25.5 KB
  Становление режима личной власти Сталина Борьба за власть среди партийных олигархов во второй половине 20х начале 30х годов. Постепенно расправившись со внутрипартийной оппозицией новая оппозиция троцкистскозиновьевский блок правый уклон в ВКПб попытка отстранить Сталина от власти на XVII съезде последовательно устранив с политической арены Каменева Зиновьева Троцкого Бухарина Рыкова и Томского Сталин к середине 30х годов сосредоточивает в своих руках все властные полномочия и фактически устанавливает тоталитарную форму...
28958. Обострение международной обстановки во второй половине 30-х годов XX века. Противоречивый характер внешней политики ведущих стран Запада и СССР накануне II-ой мировой войны 30.5 KB
  Противоречивый характер внешней политики ведущих стран Запада и СССР накануне IIой мировой войны. СССР подписал подобные договора с Францией и Чехословакией. СССР осудил введение в Германии всеобщей воинской повинности и нападение Италии на Эфиопию. был подписан договор о взаимопомощи между СССР и Монголией.
28959. СССР в условиях начавшейся II-ой мировой войны. Военные события конца 1939-1940 гг. и их современная оценка 42 KB
  СССР в условиях начавшейся IIой мировой войны. СССР объявил о своём нейтралитете. СССР и Германия подписали договор о дружбе и границе. СССР потребовал перенести границу от Ленинграда на 70 км.