Полная специализация шаблона — это создание особой версии шаблона для конкретного набора параметров, полностью заменяющей общий шаблон для этих параметров.
// Общий шаблон
template <typename T>
class Printer {
public:
void print(T value) {
std::cout << "Generic print: " << value << std::endl;
}
};
// Полная специализация для типа const char*
template <>
class Printer<const char*> {
public:
void print(const char* value) {
std::cout << "String print: " << value << std::endl;
}
};
int main() {
Printer<int> p1;
p1.print(42); // Использует общий шаблон
Printer<const char*> p2;
p2.print("hello"); // Использует специализированную версию
}
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
// Полная специализация для const char*
template <>
const char* max<const char*>(const char* a, const char* b) {
return strcmp(a, b) > 0 ? a : b;
}
Частичная специализация — это специализация шаблона, где:
// Общий шаблон
template <typename T, typename U>
class Pair {
T first;
U second;
};
// Частичная специализация для случаев, когда оба типа одинаковы
template <typename T>
class Pair<T, T> {
T first;
T second;
void printSame() { std::cout << "Same types" << std::endl; }
};
// Частичная специализация для указателей
template <typename T, typename U>
class Pair<T*, U*> {
T* first;
U* second;
void printPointers() { std::cout << "Pointer types" << std::endl; }
};
int main() {
Pair<int, double> p1; // Общий шаблон
Pair<int, int> p2; // Специализация для одинаковых типов
Pair<int*, double*> p3; // Специализация для указателей
}
Характеристика | Полная специализация | Частичная специализация |
---|---|---|
Параметры | Все фиксированы | Часть фиксирована |
Для функций | Поддерживается | Не поддерживается |
Для классов | Поддерживается | Поддерживается |
Синтаксис | template<> class C<X,Y> | template<T> class C<T,int> |
Оптимизация для конкретных типов
Работа с типами разной категории
Шаблонные метапрограммирование
Контейнеры STL
// Пример специализации для type traits
template <typename T>
struct is_pointer {
static const bool value = false;
};
template <typename T>
struct is_pointer<T*> {
static const bool value = true;
};
Порядок объявления:
Локализация:
Аргументы по умолчанию:
Частичная специализация функций:
Резюмируем: специализация шаблонов — мощный механизм C++, позволяющий создавать оптимальные реализации для конкретных типов или категорий типов, сохраняя при этом общность шаблонного подхода. Частичная специализация особенно полезна для шаблонов классов, позволяя тонко настраивать поведение для различных сценариев использования.