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

на главную

Жанры

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

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

Шрифт:

Конструкция имя-шаблонного-класса вводит описание шаблонного класса.

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

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

в программе нет, то оно будет создано.

Определение обычной (нешаблонной) функции с типом, который точно сопоставляется с типом из описания шаблонной функции, считается определением специальной шаблонной функции. Рассмотрим пример:

template‹class T› void sort(vector‹T›& v) {/*… */}

void sort(vector‹char*›& v) {/*… */}

Здесь определение функции sort будет использоваться для той функции из семейства sort, которая сопоставляется при вызове с типом параметра vector‹char*›. Для других типов vector будет создаваться соответствующее им определение функции по шаблону типа.

Можно определить класс, который задает шаблонный класс, например:

template‹class T› class stream {/*… */};

class stream‹char› {/*… */};

Здесь описание класса будет использоваться в качестве определения потока символов (stream‹char›). Другие потоки будут управляться с помощью шаблонных функций, создаваемых по шаблону типа для функций.

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

R.14.6 Функции-члены шаблонов типа

Функция-член шаблонного класса считается неявной шаблонной функцией, а параметры шаблона типа для ее класса - ее шаблонными параметрами. Приведем пример, в котором описаны три шаблона типа для функции:

template‹class T› class vector {

 T* v;

 int sz;

public:

 vector(int);

 T& operator[](int);

 T& elem(int i) { return v[i]; }

 //…

};

Функцию, выполняющую индексацию, можно определить следующим образом:

template‹class T› T& vector‹T›::operator[](int i)

{

 if (i‹0 || sz›=i) error("vector: range error");

 return v[i];

}

Шаблонный параметр для vector‹T›::operator[] будет задаваться тем типом vector, к которому применяется операция индексации.

vector‹int› v1(20);

vector‹complex› v2(30);

v1[3] = 7; // vector‹int›::operator[]

v2[3] = complex(7,8); // vector‹complex›::operator[]

R.14.7

Друзья

Функция-друг для шаблона типа не является неявной шаблонной функцией, например:

template‹class T› class task {

 //…

 friend void next_time;

 friend task‹T›* preempt(task‹T›*);

 friend task* prmt(task*); // ошибка

 //…

};

Здесь функция next_time становится другом всех классов task, а каждый класс task имеет в качестве друга функцию preempt c соответствующими типами параметров. Функцию preempt можно определить как шаблон типа.

template‹class T›

task‹T›* preempt(task‹T›* t) {/*… */}

Описание функции prmt является ошибочным, поскольку типа task не существует, а есть только специальные шаблонные типы task‹int›, task‹record›, и т.д.

R.14.8 Статические члены и переменные

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

template‹class T› class X {

 static T s;

 //…

};

X‹int› aa;

X‹char*› bb;

Здесь в классе X‹int› есть статический член типа int, а в классе X‹char› есть статический член типа char*.

Аналогично, в приведенном ниже примере, функция f(int*) имеет статический член s типа int, а функция f(char**) имеет статический член типа char**:

template‹class T› f(T* p)

{

 static T s;

 //…

}

void g(int a, char* b)

{

 f(&a);

 f(&b);

}

R.15 Обработка особых ситуаций

R.15.1 Обработка особых ситуаций

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

проверяемый-блок:

 try составной-оператор список-обработчиков

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

Проиграем?

Юнина Наталья
Любовные романы:
современные любовные романы
6.33
рейтинг книги
Проиграем?

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

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

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

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Кремлевские звезды

Ромов Дмитрий
6. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кремлевские звезды

Курсант: Назад в СССР 4

Дамиров Рафаэль
4. Курсант
Фантастика:
попаданцы
альтернативная история
7.76
рейтинг книги
Курсант: Назад в СССР 4

Камень. Книга 4

Минин Станислав
4. Камень
Фантастика:
боевая фантастика
7.77
рейтинг книги
Камень. Книга 4

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Действуй, дядя Доктор!

Юнина Наталья
Любовные романы:
короткие любовные романы
6.83
рейтинг книги
Действуй, дядя Доктор!

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

(Бес) Предел

Юнина Наталья
Любовные романы:
современные любовные романы
6.75
рейтинг книги
(Бес) Предел

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

Ваше Сиятельство 8

Моури Эрли
8. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 8