РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
704 of 815 menu

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

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

Синтаксис полной специализации начинается с ключевого слова template, за которым следуют пустые угловые скобки <>, а затем объявление шаблона с конкретными типами вместо параметров.

Синтаксис

// Основной шаблон template <typename T> class MyClass { // ... }; // Полная специализация для типа int template <> class MyClass<int> { // ... }; // Частичная специализация для указателей template <typename T> class MyClass<T*> { // ... };

Пример

Давайте создадим шаблонный класс Printer, который выводит значение на экран, и зададим полную специализацию для типа bool, чтобы вместо 1 и 0 выводились строки "true" и "false":

#include <iostream> using namespace std; template <typename T> class Printer { public: void print(T value) { cout << value << endl; } }; // Полная специализация для bool template <> class Printer<bool> { public: void print(bool value) { if (value) { cout << "true" << endl; } else { cout << "false" << endl; } } }; int main() { Printer<int> pi; pi.print(12345); Printer<bool> pb; pb.print(true); pb.print(false); return 0; }

Результат выполнения кода:

12345 true false

Пример

Теперь рассмотрим частичную специализацию. Создадим шаблонный класс Size, который возвращает размер типа в байтах, и частичную специализацию для указателей:

#include <iostream> using namespace std; template <typename T> class Size { public: static const int value = sizeof(T); }; // Частичная специализация для указателей template <typename T> class Size<T*> { public: static const int value = sizeof(void*); }; int main() { cout << Size<int>::value << endl; cout << Size<double>::value << endl; cout << Size<int*>::value << endl; cout << Size<double*>::value << endl; return 0; }

Результат выполнения кода:

4 8 8 8

Смотрите также

  • ключевое слово template,
    которое объявляет шаблон
  • ключевое слово typename,
    которое задаёт параметр-тип шаблона
  • частичная специализация partial specialization,
    которая специализирует шаблон частично
  • шаблонный класс template class,
    который описывает шаблон класса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить