Чтение онлайн

на главную - закладки

Жанры

Справочное руководство по C++

Страустрап Бьярн

Шрифт:

cvec v3(40); // v2 и v3 одного типа

v1[3] = 7;

v2[3] = v3.elem(4) = complex(7,8);

Здесь vector‹int› и vector‹complex› являются шаблонными классами, и их определения берутся по умолчанию из шаблона типа vector.

Поскольку шаблонное-имя-класса является именем-класса, то оно может использоваться там, где допустимо имя-класса, например:

class vector‹Shape*›;

vector‹Window›* current_window;

class svector: public vector‹Shape*› {/*… */};

Определение

функции-члена шаблонного класса дано в §R.14.6.

R.14.3 Эквивалентность типов

Две конструкции шаблонное-имя-класса обозначают один и тот же класс, если в них совпадают имена шаблонов типа и значения указанных параметров. Например, в следующих описаниях x и y одного типа, который отличен от типа z:

template‹class E, int size› class buffer;

buffer‹char, 2*512› x;

buffer‹char,1024› y;

buffer‹char,512› z;

Ниже приведены описания, в которых одинаковый тип имеют x2 и x3. Он отличается от типов x1 и x4:

template‹class T, void(*err_fct)›

class list {/*… */};

list‹int,&error_handler1› x1;

list‹int,&error_handler2› x2;

list‹int,&error_handler2› x3;

list‹char,&error_handler2› x4;

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;

 //…

}

Все параметры-шаблона-типа, приведенные в шаблоне типа для функции, должны быть параметрами-типа.

R.14.5 Описания и определения

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

Поделиться:
Популярные книги

Законы Рода. Том 8

Flow Ascold
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Господин следователь

Шалашов Евгений Васильевич
1. Господин следователь
Детективы:
исторические детективы
5.00
рейтинг книги
Господин следователь

Кодекс Крови. Книга ХIII

Борзых М.
13. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХIII

Законы Рода. Том 9

Flow Ascold
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Мама из другого мира. Дела семейные и не только

Рыжая Ехидна
4. Королевский приют имени графа Тадеуса Оберона
Любовные романы:
любовно-фантастические романы
9.34
рейтинг книги
Мама из другого мира. Дела семейные и не только

Черный Маг Императора 11

Герда Александр
11. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Черный Маг Императора 11

Скандальный развод, или Хозяйка владений "Драконье сердце"

Милославская Анастасия
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Скандальный развод, или Хозяйка владений Драконье сердце

Черный Маг Императора 10

Герда Александр
10. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 10

Зайти и выйти

Суконкин Алексей
Проза:
военная проза
5.00
рейтинг книги
Зайти и выйти

Лэрн. На улицах

Кронос Александр
1. Лэрн
Фантастика:
фэнтези
5.40
рейтинг книги
Лэрн. На улицах

На границе империй. Том 10. Часть 5

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Газлайтер. Том 9

Володин Григорий
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Газлайтер. Том 9

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая