|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Шаблоны функцийШаблоны обеспечивают непосредственную поддержку обобщенного программирования. Они представляют собой параметризованные классы и параметризованные имена функций. Шаблон определяется с помощью ключевого слова 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; Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |