Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Специализация шаблонов класса

Читайте также:
  1. Cоциальный паспорт класса
  2. II. Цели и задачи организации учебно-воспитательной работы кадетского класса
  3. III. Организация деятельности кадетского класса
  4. V. Трудовая деятельность класса.
  5. Бело-голубой экспресс класса люкс до Кейптауна
  6. В гуманитарных классах старшей школы.
  7. В этой рубрике – о том, какие новости произошли именно в вашем классе. Далеко не всё самое интересное происходит в актовом зале. В жизни каждого класса есть приятные мелочи!

Явную специализацию шаблона класса можно определять только после того, как общий шаблон уже был объявлен (хотя и не обязательно определен). Иными словами, должно быть известно, что специализируемое имя обозначает шаблон класса.

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

Если класс специализируется целиком, лексемы template <> помещаются только перед определением явной специализации всего шаблона:

#include "QueueLD.h"

// определяет функцию-член min()

// из специализированного шаблона класса

LongDouble Queue<LongDouble>::min() { }

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

Рассмотрим шаблон класса Screen. Частичная специализации Screen<hi,80> дает более эффективную реализацию для экранов с 80 столбцами:

template <int hi, int wid>

class Screen {

//...

};

// частичная специализация шаблона класса Screen

template <int hi>

class Screen<hi, 80> {

public:

Screen();

//...

private:

string _screen;

string::size_type _cursor;

short _height;

// для экранов с 80 колонками используются специальные алгоритмы

};

Частичная специализация шаблона класса — это шаблон, и ее определение похоже на определение шаблона. Оно начинается с ключевого слова template, за которым следует список параметров, заключенный в угловые скобки. Список параметров здесь отличается от соответствующего списка параметров общего шаблона. Для частичной специализации шаблона Screen есть только один параметр-константа hi, поскольку значение второго аргумента равно 80, т.е. в данном списке представлены только те параметры, для которых фактические аргументы еще неизвестны.

Имя частичной специализации совпадает с именем того общего шаблона, которому она соответствует, в нашем случае Screen. Однако за ее именем всегда следует список аргументов. В примере выше этот список выглядит как <hi, 80>. Поскольку значение аргумента для первого параметра шаблона неизвестно, то на этом месте в списке стоит имя параметра шаблона; вторым же аргументом является значение 80, которым частично специализирован шаблон.

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

 

// конструктор для частичной специализации Screen<hi,80>

template <int hi>

Screen<hi,80>::Screen(): _height(hi), _cursor(0),_screen(hi * 80, bk)

{ }

Если для конкретизации некоторого класса применяется частичная специализация, то определение конструктора из общего шаблона не используется даже тогда, когда определение конструктора Screen отсутствует.


Дата добавления: 2015-09-03; просмотров: 124 | Нарушение авторских прав


Читайте в этой же книге: Перегрузка операций (операторов). Перегрузка операторов доступа к членам класса. Перегрузка операторов new и delete. Функции преобразования типа. | Полиморфизм и виртуальные функции. Раннее и позднее связывание. Динамический полиморфизм. Виртуальные функции. Виртуальные и невиртуальные функции. | Полиморфизм и виртуальные функции. Применение динамического полиморфизма. Виртуальные деструкторы. Абстрактные классы и чисто виртуальные функции. | Длина самого длинного слова 10 | Самое длинное слово beautiful | Строковые потоки | Состояние формата (ОТНОСИТСЯ К ПОСЛЕДНЕМУ ВОПРОСУ, КОТОРЫЙ 24) | Работа с несовместимыми конструкциями. | Стандартный класс string. Зарезервированные слова и опции меню. | Стандартный класс string. Операции ввода-вывода строк. |
<== предыдущая страница | следующая страница ==>
Описание таблицы акселераторов| Схемы отображения шрифтов

mybiblioteka.su - 2015-2024 год. (0.007 сек.)