Специализация шаблона
Специализация шаблона - это механизм языка 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,
который описывает шаблон класса