Достоинства и недостатки шаблонов

Специализация

A 1 1 B 2 4 C 3 9 D 4 16 E

Стандарт C++ допускает также использование параметров-шаблонов, но это реализовано далеко не во всех компиляторах, поэтому лучше ими не пользоваться.

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

template <> class имя_класса <имя_специализированного_типа>

{ /* … */ };

Например:

// общий шаблон

template <class Т> class Sample {

bool Less(T) const;

/*…*/ };

// специализация для char*

template <> class Sample<char*> {

bool Less(char*) const;

/*…*/ };

Если шаблонный класс имеет несколько параметров, то возможна частичная специализация. Например:

/ / общий шаблон

template <class Tl, class Т2> class Pair { / *... * / };

/ / специализация, где для Т2 установлен тип int

template <class Т1> class Pair <Т1, int> { /*..*/ };

В любом случае общий шаблон должен быть объявлен прежде любой специализации.

Иногда есть смысл специализировать не весь класс, а какой-либо из его методов.

Например:

/ / обобщенный метод

template <class Т> bool Sample<T>::Less(T ob) const { / *... * / }:

/ / специализированный метод

bool Sample<char*>::Less(char* ob) const { / *... * / }:

Шаблоны представляют собой мощное и эффективное средство обращения с различными типами данных, которое можно назвать параметрическим полиморфизмом, а также обеспечивают безопасное использование типов.

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

----------------------------------

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

Сначала рассмотрим не параметризованную версию класса «двусвязанный линейный список».

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

class Node{

public:

int d; // Данные

Node *next; // Указатель на последующий узел

Node *prev; // Указатель на предыдущий узел

Node(int dat = 0){ // Конструктор

d = dat; next = 0; prev = 0;

}

};

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

Это позволяет обойтись без функций доступа и изменения полей. Назовем класс списка List:

class List{


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: