Составители:
Рубрика:
Каждая версия класса или функции, создаваемая по шаблону, содержит одинако-
вый базовый код; изменяется только то, что связано с параметрами шаблона. При этом
эффективность работы версий, создаваемых для различных типов данных, может сильно
различаться.
Если для какого-либо типа данных существует более эффективный код, можно ли-
бо предусмотреть для этого типа специальную реализацию отдельных методов, либо
полностью переопределить (специализировать) шаблон класса.
Для специализации метода требуется определить вариант его кода, указав в заго-
ловке конкретный тип данных. Например, если заголовок обобщенного метода print
шаблона A имеет вид
template <class Data> void A <Data>::print();
Специализированный метод для вывода списка символов будет выглядеть следующим
образом:
void A <char>::print()
{
... // Тело специализированного варианта метода print
}
Если в программе создать экземпляр шаблона A типа char, соответствующий вари-
ант метода будет вызван автоматически.
При специализации целого класса после описания обобщенного варианта класса
помещается полное описание специализированного класса, при этом требуется заново
определить все его методы. Допустим, требуется специализировать шаблон B, описан-
ный в предыдущем разделе, для хранения 100 целых величин:
class B<int, 100>
{
public:
B(){p = new int [100];}
~B(){delete [] p;}
operator int *();
protected:
int * p;
};
B<int, 100:: operator int *()
{
return p;
}
При определении экземпляров шаблона B с параметрами int и 100 будет задейство-
ван специализированный вариант.
Шаблоны представляют собой мощное и эффективное средство обращения с раз-
личными типами данных, которое можно назвать параметрическим полиморфизмом, а
также обеспечивают безопасное использование типов, в отличие от макросов препроцес-
сора. Однако следует иметь в
виду, что программа, использующая шаблоны, содержит
полный код для каждого порожденного типа, что может увеличить размер исполняемого
файла. Кроме того, с некоторыми типами данных шаблоны могут работать не так эффек-
тивно, как с другими. В этом случае имеет смысл использовать специализацию шаблона.
103
Каждая версия класса или функции, создаваемая по шаблону, содержит одинако- вый базовый код; изменяется только то, что связано с параметрами шаблона. При этом эффективность работы версий, создаваемых для различных типов данных, может сильно различаться. Если для какого-либо типа данных существует более эффективный код, можно ли- бо предусмотреть для этого типа специальную реализацию отдельных методов, либо полностью переопределить (специализировать) шаблон класса. Для специализации метода требуется определить вариант его кода, указав в заго- ловке конкретный тип данных. Например, если заголовок обобщенного метода print шаблона A имеет вид templatevoid A ::print(); Специализированный метод для вывода списка символов будет выглядеть следующим образом: void A ::print() { ... // Тело специализированного варианта метода print } Если в программе создать экземпляр шаблона A типа char, соответствующий вари- ант метода будет вызван автоматически. При специализации целого класса после описания обобщенного варианта класса помещается полное описание специализированного класса, при этом требуется заново определить все его методы. Допустим, требуется специализировать шаблон B, описан- ный в предыдущем разделе, для хранения 100 целых величин: class B { public: B(){p = new int [100];} ~B(){delete [] p;} operator int *(); protected: int * p; }; B
Страницы
- « первая
- ‹ предыдущая
- …
- 101
- 102
- 103
- 104
- 105
- …
- следующая ›
- последняя »