Interested Article - Частичная специализация шаблона

Частичная специализация шаблона — механизм языка программирования C++ , предназначенный для специализации обобщённых шаблонных классов под конкретные задачи или под конкретное подмножество своих параметризованных типов данных . По мнению американского учёного и создателя C++ Б. Страуструпа специализация шаблонов является эффективным средством предотвращения неконтролируемого разрастания объёмов кода при активном использовании инструментария классов-шаблонов даже при разработке программных проектов умеренного размера. Это связывают с тем, что она не позволяет генерировать избыточные реплики кода под каждый конкретный тип данных, заменяя их более обобщёнными фрагментами кода и вдобавок сокращая время компиляции и компоновки конечного продукта .

Явная полная специализация

В C++ явная специализация параметризованного типа данных (шаблона) осуществляется через создание дополнительного класса-шаблона в котором входные параметры первичного класса полностью или частично переопределяются конкретными типами данных .

Синтаксис такого переопределения выглядит следующим образом :

template <список входных параметров класса-шаблона>
class|struct|union имя_класса <список аргументов класса-шаблона>

Например :

// первичный класс
template <typename Window, typename Controller> 
class Widget
{ /* ... реализация параметризованного класса Widget для любого вида окна Window и любого обработчика событий Controller */ }; 

// явная специализация первичного класса
template <>
class Widget <DialogWindow, DialogController>
{ /* ... реализация класса Widget под работу с диалоговым окном DialogWindow и обработчиком событий диалогового окна DialogController */ };

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

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

Частичная специализация

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

// первичный класс
template <typename T>
class Vector
{ /* ... реализация класса-контейнера для объектов типа T... */ };
// частичная специализация первичного класса для хранения указателей
template <typename T>
class Vector<T*>
{ /* ... реализация класса-контейнера для указателей на объекты типа T... */ };

В этом случае аргумент-параметр шаблона не является выражением, переданным шаблону в качестве аргумента, а выводится из конструкции аргумента на базе объявленного шаблона первичного класса .

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

Пример

Гибкое использование частичной специализации шаблонов позволяет эффективно выполнять некоторые нетривиальные типы вычислений. Например, достаточно несложная композиция классов может помочь с вычислением структуры (количества размерностей) многомерного массива с элементами заранее неизвестного типа :

// первичный класс
template<class T> 
struct RankOfArray 
{ static const int value = 0; };
// рекуррентный частично специализированный класс
template<class T, int N> 
struct RankOfArray < T[N] > 
{ static const int value = 1+RankOfArray<T>::value; };

См. также

Примечания

  1. Alexandrescu A. 2.2 Partial Template Specialization // . — Addison Wesley, 2001. — P. 22—23. — 352 p. — ISBN 0-201-70431-5 .
  2. Stroustrup B. 25.3 Specialization // The C++ Programming Language. — 4th edition. — Addison-Wesley, 2013. — P. 730. — ISBN 978-0-321-56384-2 .
  3. Baumann R. 3.1 Explicit specialization // A profound reflection on C++ template mechanism. — Zurich: Swiss Federal Institute of Technology ETH, 2002. — P. 10.
  4. Побегайло А. П. 19.5 Частичная специализация шаблона класса // C/C++ для студентов. — БХВ-Петербург, 2006. — С. 265. — 528 с. — (Computers). — ISBN 5-94157-647-1 .
  5. Baumann R. 3.2 Partial specialization of class template // A profound reflection on C++ template mechanism. — Zurich: Swiss Federal Institute of Technology ETH, 2002. — P. 13.

Ссылки

Источник —

Same as Частичная специализация шаблона