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

}

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


 

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

21185. Векторний та змішаний добутки векторів. Площина та пряма в просторі 522 KB
  У множині геометричних векторів можна ввести так званий векторний добуток двох векторів коли кожній парі векторів співставляється третій вектор який і називається їх добутком: . Вектор направлений перпендикулярно площині в якій лежать вектори і і в таку сторону щоб трійка векторів складала праву трійку інакше кажучи щоб ці вектори були орієнтовані по правилу правої руки Рис.1 Векторний добуток векторів Довжина вектора визначається за формулою 15.
21186. Лінійні оператори. Матриця оператора 476.5 KB
  Лінійні оператори. Матриця оператора. Лінійні оператори.
21187. Власні числа та власні вектори оператора. Самоспряжені оператори 822 KB
  1 то він називається власним вектором оператора а число його власним числом. Таким чином дія оператора на власний вектор дає той же вектор помножений на власне число. Це алгебраїчне рівняння степені називається характеристичним рівнянням оператора .
21188. Ортогональні оператори. Квадратичні формию. Криві другого порядку 282 KB
  2 то одержимо друге означення ортогонального оператора або .3 Звідси маємо для матриці ортогонального оператора або 18.5 показує що рядки стовпці матриці ортогонального оператора ортогональні.1 витікають властивості ортогонального оператора: 1 Якщо ортогональний то і ортогональні.
21189. Криві другого порядку 454.5 KB
  Як було показано в попередній лекції загальне рівняння другого порядку в системі координат побудованій на власних векторах матриці квадратичної форми рівняння має вид 18.1 Спочатку розглянемо випадок коли це рівняння еліптичного або гіперболічного типу тобто . Якщо то рівняння 19. Якщо маємо два рівняння прямих що проходять через новий початок координат .
21190. Поверхні другого порядку 575 KB
  Розглянемо більш загальне рівняння яке містить в собі і квадратичний вираз на предмет того який геометричний об€єкт воно описує.1 перетвориться у рівняння 20. В новій системі координат рівняння 20. Перепишемо рівняння 20.
21191. Матриці. Лінійні дії з матрицями. Поняття лінійного простору 207 KB
  Лінійні дії з матрицями. Вона характеризується таблицею чисел яку можна записати окремо і розглядати як суцільний об€єкт що має назву €œматриця€ лат.2 Очевидно що матриця є узагальненням як числа так і вектора. Дійсно при m=1 n=1 матриця зводиться до числа при m=1 n=3 вона є векторрядок а при m=3 n=1 векторстовпець.
21192. Множення матриць. Поняття детермінанта 255.5 KB
  Множення матриць. Розглянемо якісно нову відмінну від введених в попередній лекції операцій а саме нелінійну операцію множення матриць. Визначити операцію множення матриць це означає вказати яким чином даній парі матриць ставиться у відповідність третя матриця яка і буде їх добутком.
21193. Властивості детермінантів 220.5 KB
  Детермінант транспонованої матриці дорівнює детермінанту даної. З очевидної рівності випливає що детермінант можна записати також у вигляді == =.2 Після транспонування одержимо детермінант в добутках якого індекси множників помінялись місцями.