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

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

Читайте также:
  1. Анализ функций управления руководства.
  2. Б. Особенности нервного и гуморального механизмов регуляции функций организма.
  3. В зависимости от их функций в предложении.
  4. В-35 Классификация функций гос-ва: основные подходы?
  5. Взаимосвязь функций денег. Единство функций денег как выражение их сущности
  6. Вопрос 24. Локальные свойства непрерывных функций: локальная ограниченность, устойчивость знака и сохранение непрерывности при арифметических операциях.
  7. Дифференциальное исчисление функций нескольких переменных
  8. Дифференциальное исчисление функций одной переменной
  9. Использование в расчетах вложенных функций
  10. Использование функций для работы с базами данных
  11. Использование функций ПЛТ, ПРПЛТ, ОСПЛТ для составления схемы погашения займа.
  12. Исследование функций и построение графиков.

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

 

template<class T>

void sort(vector<T>& v);

 

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

При использовании шаблонов существует три больших недостатка:

ƒ1) шаблоны невозможно отлаживать.

Разработка шаблонов обычно ведется так:

разрабатывается класс или функция конкретного типа данных;

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

ƒ2) Cущественно замедляется время компиляции. В больших проектах оно может доходить до 30 – 60 минут.

3) очень быстро растут размеры объектных модулей и библиотек на диске. Компиляция относительно большого проекта в отладочном режиме может потребовать до 10 ГБ.

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

Можно объявить несколько шаблонов функций с одним и тем же именем, а также можно объявить комбинацию шаблонов и обычных функций с одинаковым именем:

 

template<class T>

T sqrt(T x)

template<class T>

complex<T> sqrt(complex<T> x);

template<class T>

doubles sqrt(double x);

void Proc(complex<double> z)

{

sqrt(2); // sqrt<int>(int)

sqrt(2.0); // sqrt(double)

sqrt(z); // sqrt<double>(complex<double>)

}

 

Шаблонные функции могут вызываться с явным указанием параметра шаблона:

sqrt<int>(2);

или без него:

sqrt(2);

В этом случае применяется механизм разрешения перегрузки:

ƒ ищется набор специализации шаблонов функций, которые примут участие в разрешении перегрузки;

ƒ если могут быть вызваны два шаблона функций и один из них более специализирован, то только он и будет рассматриваться;

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

ƒ если и обычная функция, и специализация подходят одинаково хорошо, предпочтение отдается обычной функции;

ƒ если ни одного соответствия не найдено, или существует несколько одинаково хорошо подходящих вариантов, то выдается ошибка.

 

В параметрах шаблонов допустимы стандартные значения, принимаемые по умолчанию:

 

class Allocator

{

... // malloc, free, calloc

};

template <class T, class A = Allocator>

class basic_string

{

...

};

basic_string<char, MyAllocator> mystr;

basic_string<char> commonstr;


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 |

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



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