Читайте также:
|
|
Явную специализацию шаблона класса можно определять только после того, как общий шаблон уже был объявлен (хотя и не обязательно определен). Иными словами, должно быть известно, что специализируемое имя обозначает шаблон класса.
Если мы определяем специализацию всего шаблона класса, то должны определить также все без исключения функции-члены и статические данные-члены. Определения членов из общего шаблона никогда не используются для создания определений членов явной специализации: множества членов этих шаблонов могут различаться.
Если класс специализируется целиком, лексемы 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 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Описание таблицы акселераторов | | | Схемы отображения шрифтов |