Справочное руководство по C++
Шрифт:
Конструкция имя-шаблонного-класса вводит описание шаблонного класса.
Вызов шаблонной функции или взятие ее адреса вводит описание шаблонной функции. Для вызова или взятия адреса шаблонной функции в языке существует особое соглашение: имя шаблонной функции используется точно так же как имя обычной функции. Описание функции с таким же именем, как у шаблонной функции, и с сопоставимыми типами параметров, вводит описание специальной шаблонной функции.
Если для выполнения некоторых операций требуется определение специального шаблонного класса или специальной шаблонной функции, и если такого определения
Определение обычной (нешаблонной) функции с типом, который точно сопоставляется с типом из описания шаблонной функции, считается определением специальной шаблонной функции. Рассмотрим пример:
Здесь определение функции sort будет использоваться для той функции из семейства sort, которая сопоставляется при вызове с типом параметра vector‹char*›. Для других типов vector будет создаваться соответствующее им определение функции по шаблону типа.
Можно определить класс, который задает шаблонный класс, например:
Здесь описание класса будет использоваться в качестве определения потока символов (stream‹char›). Другие потоки будут управляться с помощью шаблонных функций, создаваемых по шаблону типа для функций.
Пока не появится описание шаблона типа для класса, никакие операции, которым требуется определенный класс, не могут быть произведены над шаблонным классом. После этого специальный шаблонный класс будет считаться определенным, причем сразу же перед первым глобальным описанием, использующим его имя.
R.14.6 Функции-члены шаблонов типа
Функция-член шаблонного класса считается неявной шаблонной функцией, а параметры шаблона типа для ее класса - ее шаблонными параметрами. Приведем пример, в котором описаны три шаблона типа для функции:
Функцию, выполняющую индексацию, можно определить следующим образом:
Шаблонный параметр для vector‹T›::operator[] будет задаваться тем типом vector, к которому применяется операция индексации.
R.14.7
Функция-друг для шаблона типа не является неявной шаблонной функцией, например:
Здесь функция next_time становится другом всех классов task, а каждый класс task имеет в качестве друга функцию preempt c соответствующими типами параметров. Функцию preempt можно определить как шаблон типа.
Описание функции prmt является ошибочным, поскольку типа task не существует, а есть только специальные шаблонные типы task‹int›, task‹record›, и т.д.
R.14.8 Статические члены и переменные
Для каждого шаблонного класса или функции, создаваемых по шаблону типа, образуется своя копия статических переменных или членов. Рассмотрим пример:
Здесь в классе X‹int› есть статический член типа int, а в классе X‹char› есть статический член типа char*.
Аналогично, в приведенном ниже примере, функция f(int*) имеет статический член s типа int, а функция f(char**) имеет статический член типа char**:
R.15 Обработка особых ситуаций
R.15.1 Обработка особых ситуаций
При обработке особых ситуаций в ходе выполнения программы информация и управление передаются из некоторой точки обработчику особых ситуаций. Обработчик находится в цепочке выполненных вызовов функций. Управление обработчику передается с помощью выражения-запуска, которое может быть только в проверяемом-блоке обработчика или в функции, вызванной из проверяемого-блока.