АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перегрузка шаблонов функций

Читайте также:
  1. Автоматизация функций в социальной работе
  2. АНАЛИЗ ФУНКЦИЙ СПЕЦИАЛИСТОВ ПО СТРАТЕГИЧЕСКОМУ МЕНЕДЖМЕНТУ И ПОЛНОМОЧИЙ ОРГАНОВ УПРАВЛЕНИЯ ОРГАНИЗАЦИИ, ПРИНИМАЮЩИХ СТРАТЕГИЧЕСКИЕ РЕШЕНИЯ.
  3. Анализ функций управления
  4. Б) Вычисление тригонометрических функций.
  5. Введение в стандартную библиотека шаблонов (STL): контейнеры, алгоритмы, итераторы.
  6. Ввод функций вручную
  7. Взаимная ортогональность собственных функций эрмитовых операторов
  8. Взаимосвязь правопорядка и функций государства
  9. Возрастание и убывание функций. Экстремумы функции
  10. Вопрос 17 Принципы,функций и формы оплаты труда
  11. Вопрос 9 цели и функций системы управления
  12. Вопрос35. Предел Функции в точке и на бесконечности. Геометрическая иллюстрация определений. Предел постоянной. Предел суммы, частного, произведения. Предел элементарных функций.

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

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

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

Перегрузка шаблона создается путем явного его определения (специализированная функция) для конкретного типа данных.

Например, для строк шаблон-функция mах не подходит, так как все операции над строками производятся только при помощи библиотечных функций, декларированных в заголовочном файле string. h.

Шаблон функции поиска максимума будет иметь следующий вид:

template <class T>

T max(T x, T y) {

return (x>y)? x: y;

}

Специализированная функция выбора максимальной из двух строк:

char* max(char* x, char* y) {

return (strcmp(x, y)>0)? x: y;

}

Осуществляется следующая последовательность этапов выбора «экземпляра» перегруженных функций:

1) поиск специализированной (не шаблон) функции с совпадающим списком параметров, и в случае неудачи:

– поиск шаблона функции с точным соответствием списка параметров;

– поиск специальной функции по условию совпадения списка параметров после возможных преобразований типов;

2) поиск завершается выбором нужной функции при совпадении параметров экземпляра функции со списком передаваемых аргументов.

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

#include <stdio.h>

#include <string.h>

template <class T>

T max(T x, T y) {

return (x>y)? x: y;

}

char* max(char* x, char* y) {

return (strcmp(x, y)>0)? x: y;

}

void main()

{

int a=7, b=5;

char c1=’a’, c2=’z’;

char s1[]=”one”, s2[]=”two”;

printf(“\n a=%d, b=%d, max=%d \n”, a, b, max(a, b));

printf(“\n c1=%c, c2=%c, max=%c \n”, c1, c2, max(c1, c2));

printf(“\n s1=%s, s2=%s, max=%s \n”, s1, s2, max(s1, s2));

}

 

При построении шаблонов функций, они, как правило, декларируются прототипами, а в программе определяются в произвольном порядке.

Рассмотрим пример нахождения максимального значения в массивах с данными различных типов.

...

template <class T> Maxa(T *z, int n); // прототип шаблона

void main(void) {

int a[100], n;

printf("\n Input n < 100: ");

scanf("%d", &n);

for(int i=0; i<n; i++) {

printf("\n a[%d] = ", i+1);

scanf("%d", &a[i]);

}

printf("\n Max int = %d ", Maxa(a, n));

// Вызывается функция Maxa для типа int

double b[ ] = {0.22, 1.5, 0.88};

printf("\n Max double = %lf ", Maxa(b,3));

// Вызывается функция Maxa для типа double

char Str[ ] = "ABC123abc";

printf("\n Max char = %c ", Maxa(Str, (int)strlen(Str)));

// Вызывается Maxa для типа char

}

// Код шаблона

template <class T>

T Maxa(T *z, int n) {

int imax = 0;

for(int i=1; i<n; i++)

if(z[i]>z[imax]) imax = i;

return (z[imax]);

}

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)