Специализация шаблонов — механизм, позволяющий предоставить особую реализацию шаблона для конкретных параметров. Это ключевая возможность для создания гибких и оптимизированных шаблонных конструкций.
template<typename T>
void print(T value) {
std::cout << "Generic: " << value << std::endl;
}
template<>
void print(const char* value) { // Специализация для const char*
std::cout << "C-string: " << value << std::endl;
}
template<typename T>
class Storage {
T value;
public:
void print() { std::cout << value << std::endl; }
};
template<>
class Storage<bool> { // Специализация для bool
bool value;
public:
void print() { std::cout << (value ? "true" : "false") << std::endl; }
};
Доступна только для шаблонов классов:
template<typename T>
class PtrWrapper {
T* ptr;
public:
void print() { std::cout << *ptr << std::endl; }
};
template<typename T>
class PtrWrapper<T*> { // Частичная специализация для любых указателей
T** ptr;
public:
void print() { std::cout << **ptr << std::endl; }
};
template<typename T, size_t N>
class Array {
T data[N];
};
template<typename T>
class Array<T, 0> { // Специализация для нулевого размера
static T dummy;
};
Можно специализировать отдельные методы класса:
template<typename T>
class Calculator {
public:
T add(T a, T b) { return a + b; }
};
template<>
int Calculator<int>::add(int a, int b) { // Специализация метода
return a + b + 1; // Специальная логика для int
}
Компилятор выбирает наиболее специализированную версию по правилам:
Пример:
template<typename T, typename U>
class Pair { /* основной шаблон */ };
template<typename T>
class Pair<T, T> { /* частичная специализация для одинаковых типов */ };
template<>
class Pair<int, int> { /* полная специализация для int/int */ };
template<typename T>
constexpr bool is_pointer_v = false;
template<typename T>
constexpr bool is_pointer_v<T*> = true; // Специализация для указателей
template<typename T>
void sort(Container<T>& c) { /* общая реализация */ }
template<>
void sort(Container<int>& c) { /* оптимизированная для int */ }
template<typename T>
class Serializer { /* общий случай */ };
template<>
class Serializer<JSON> { /* обработка JSON */ };
template<typename T>
struct is_void { static constexpr bool value = false; };
template<>
struct is_void<void> { static constexpr bool value = true; };
Функции:
Порядок объявления:
Правила ODR:
template<typename T>
requires std::integral<T>
void process(T value) { /* для целочисленных */ }
template<typename T>
void process(T value) { /* общий случай */ }
Резюмируем: специализация шаблонов — мощный инструмент для создания гибких и эффективных шаблонных конструкций. Она позволяет оптимизировать обработку особых случаев, сохраняя при этом общность подхода. Правильное использование специализации требует понимания правил выбора шаблонов и ограничений механизма.