R.14.4 Шаблоны типа для функций
R.14.4 Шаблоны типа для функций
Шаблон типа для функции определяет как будет строиться функция. Например, семейство функций sort можно описать следующим образом:
template‹class T› void sort(vector‹T›);
Шаблон типа для функции порождает неограниченное множество перегруженных функций. Функция, порождаемая шаблоном типа для функций, называется шаблонной функцией. Она эквивалентна функции, в описании которой указан тип, соответствующий шаблону, см. §R.14.5.
При вызове шаблонной функции параметры шаблона типа не задаются явно, вместо этого применяется правило разрешения неопределенности перегруженных функций. Рассмотрим пример:
vector‹complex› cv(100);
vector‹int› ci(200);
void f(vector‹complex›& cv, vector‹int›& ci)
{
sort(cv); // вызывается sort(vector‹complex›)
sort(ci); // вызывается sort(vector‹int›)
}
Шаблонная функция может быть перегружена как обычными, так и шаблонными функциями с тем же именем. Для разрешения неопределенности шаблонных и обычных функций с одним и тем же именем надо последовательно пройти три шага:
[1] Попытаться найти точно сопоставимую вызову (§R.13.2) функцию, и если она найдена, вызвать ее.
[2] Попытаться найти шаблон типа для функций, по которому можно создать точно сопоставимую с рассматриваемым вызовом функцию. Если удалось найти, то вызвать функцию.
[3] Попытаться применить обычное правило разрешения неопределенности перегруженных функций (§R.13.2). Если с его помощью функция найдена, вызвать ее.
Если не найдено сопоставимой функции, вызов является ошибочным.
Если уже на первом шаге найдено более одного кандидата, сопоставимого с данной функцией, то вызов также считается неоднозначным и ошибочным.
Успешное выполнение шага [2] приведет к созданию некоторой шаблонной функции с параметрами (§R.14.5), типы которых точно сопоставятся с типами параметров, указанных в вызове. В этом случае недопустимо расхождение даже за счет тривиальных преобразований (§R.13.2).
Такие же действия применяются для сопоставления типов указателей на функции (§R.13.3).
Рассмотрим пример:
template‹class T› T max(T a, T b) { return a›b ? a : b; };
void f(int a, int b, char c, char d)
{
int m1 = max(a,b); // max(int a, int b)
char m2 = max(c,d); // max(char c, char b)
int m3 = max(a,c); // ошибка: нельзя создать max(int,char)
}
Добавив к этому примеру описание
int max(int,int);
можно разрешить неопределенность для третьего вызова, поскольку теперь задана функция, которая после стандартного преобразования char в int, может сопоставиться с вызовом max(a,c).
Определение шаблона типа для функции используется для создания различных вариантов шаблона типа. Для вызова определенного варианта достаточно лишь описания шаблона типа.
Каждый параметр-шаблона-типа, который приведен в списке-параметров-шаблона-типа должен обязательно использоваться при задании типов параметров в шаблоне типа для функции.
template‹class T› T* create(); //ошибка
template‹class T›
void f() {// ошибка
T a;
//…
}
Все параметры-шаблона-типа, приведенные в шаблоне типа для функции, должны быть параметрами-типа.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Шаблоны
Шаблоны Делать работу, которая до этого уже была выполнена другими, – напрасная трата времени и сил. Ваши усилия, затраченные на оформление списка приглашенных на вечеринку, можно направить на другие неотложные дела, если воспользоваться подсистемой шаблонов. Созданные
R.14 ШАБЛОНЫ ТИПА
R.14 ШАБЛОНЫ ТИПА R.14.1 Шаблоны типа Шаблон типа определяет целое семейство типов или функций.описание-шаблона-типа: template ‹ список-параметров-шаблона-типа › описаниесписок-параметров-шаблона-типа: параметр-шаблона-типа список-параметров-шаблона-типа ,
R.14.1 Шаблоны типа
R.14.1 Шаблоны типа Шаблон типа определяет целое семейство типов или функций.описание-шаблона-типа: template ‹ список-параметров-шаблона-типа › описаниесписок-параметров-шаблона-типа: параметр-шаблона-типа список-параметров-шаблона-типа ,
R.17.8 Шаблоны типа
R.17.8 Шаблоны типа описание-шаблона-типа: template ‹ список-параметров-шаблона-типа › описаниесписок-параметров-шаблона-типа: параметр-шаблона-типа список-параметров-шаблона-типа ,
Отличия процедур типа Function от процедур типа Sub
Отличия процедур типа Function от процедур типа Sub Между процедурами типа Function и типа Sub есть одно существенное отличие: в процедуре типа Function обязательно где-то должен присутствовать по крайней мере один оператор, задающий значение этой функции. При этом используется имя
66. Не специализируйте шаблоны функций
66. Не специализируйте шаблоны функций РезюмеПри расширении некоторого шаблона функции (включая std::swap) избегайте попыток специализации шаблона. Вместо этого используйте перегрузку шаблона функции, которую следует поместить в пространство имен типа(ов), для которых
Правило 45: Разрабатывайте шаблоны функций-членов так, чтобы они принимали «все совместимые типы»
Правило 45: Разрабатывайте шаблоны функций-членов так, чтобы они принимали «все совместимые типы» Интеллектуальные указатели – это объекты, которые ведут себя во многом подобно обычным указателям, но добавляют функциональность, которую последние не предоставляют.
Совет 46. Передавайте алгоритмам объекты функций вместо функций
Совет 46. Передавайте алгоритмам объекты функций вместо функций Часто говорят, что повышение уровня абстракции языков высокого уровня приводит к снижению эффективности сгенерированного кода. Александр Степанов, изобретатель STL, однажды разработал небольшой комплекс
Шаблоны функций классов в STL
Шаблоны функций классов в STL Допустим, у вас есть два вектора объектов Widget, требуется скопировать объекты Widget из одного вектора в конец другого. Задача решается легко — достаточно воспользоваться интервальной функцией insert контейнера vector:vector<Widget>
10. Шаблоны функций
10. Шаблоны функций В этой главе рассказывается, что такое шаблон функции, как его определять и использовать. Это довольно просто, и многие программисты применяют шаблоны, определенные в стандартной библиотеке, даже не понимая, с чем они работают. Только пользователи,
10.10. Пространства имен и шаблоны функций А
10.10. Пространства имен и шаблоны функций А Как и любое другое глобальное определение, шаблон функции может быть помещен в пространство имен (см. обсуждение пространств имен в разделах 8.5 и 8.6). Мы получили бы ту же семантику, если бы определили шаблон в глобальной области
12.3.5. Адаптеры функций для объектов-функций
12.3.5. Адаптеры функций для объектов-функций В стандартной библиотеке имеется также ряд адаптеров функций, предназначенных для специализации и расширения как унарных, так и бинарных объектов-функций. Адаптеры – это специальные классы, разбитые на следующие две
19.11.2. Вызов функций из файла функций
19.11.2. Вызов функций из файла функций Мы уже рассматривали, каким образом функции вызываются из командной строки. Эти типы функций обычно используются утилитами, создающими системные сообщения.А теперь воспользуемся снова описанной выше функцией, но в этом случае
13.2.2. Шаблоны
13.2.2. Шаблоны Вы хотите создать стандартный документ, например резюме, служебную записку, отчет? Тогда вам пригодятся стандартные шаблоны MS Word. Выполните команду Файл, Создать. В правой части окна Word появится окошко Создание документа, в котором можно выбрать один из
Шаблоны
Шаблоны Шаблон – это своего рода набросок, который можно изменить под конкретные нужды. Очень часто вам придется писать однотипные сообщения вроде «Привет. Как дела?» или «Я сегодня занят. Когда освобожусь – перезвоню!». Вы можете облегчить себе жизнь, записав подобные
Шаблоны
Шаблоны Шаблон представляет собой заготовку или бланк для часто используемых документов. Можно воспользоваться готовым шаблоном, загрузить шаблон из Интернета или использовать в качестве шаблона любую ранее сохраненную книгу.Для создания нового документа на основе