Шаблоны и специализация
Введение
Шаблоны в C++ предоставляют мощный механизм для написания универсального кода, который может работать с различными типами данных. Специализация шаблонов позволяет адаптировать шаблонный код для конкретных типов, предоставляя специализированные реализации.
Шаблоны
Функции-шаблоны
Функции-шаблоны позволяют писать универсальные функции, которые могут принимать аргументы любого типа.
Пример функции-шаблона
#include <iostream>
template <typename T>T add(T a, T b) { return a + b;}
int main() { std::cout << "Int: " << add(1, 2) << std::endl; std::cout << "Double: " << add(1.5, 2.5) << std::endl;
return 0;}Вывод
Int: 3Double: 4В этом примере функция add является шаблоном, который может работать как с целыми числами, так и с числами с плавающей запятой.
Классы-шаблоны
Классы-шаблоны позволяют создавать классы, которые могут работать с различными типами данных.
Пример класса-шаблона
#include <iostream>
template <typename T>class Pair {private: T first, second;
public: Pair(T a, T b) : first(a), second(b) {}
T getFirst() const { return first; } T getSecond() const { return second; }};
int main() { Pair<int> intPair(1, 2); Pair<double> doublePair(1.5, 2.5);
std::cout << "Int Pair: (" << intPair.getFirst() << ", " << intPair.getSecond() << ")" << std::endl; std::cout << "Double Pair: (" << doublePair.getFirst() << ", " << doublePair.getSecond() << ")" << std::endl;
return 0;}Вывод
Int Pair: (1, 2)Double Pair: (1.5, 2.5)В этом примере класс Pair является шаблоном, который может хранить пары значений различных типов.
Специализация шаблонов
Полная специализация
Полная специализация позволяет определить реализацию шаблона для конкретного типа.
Пример полной специализации
#include <iostream>
template <typename T>class MyClass {public: void print() { std::cout << "Generic template" << std::endl; }};
template <>class MyClass<int> {public: void print() { std::cout << "Specialized template for int" << std::endl; }};
int main() { MyClass<double> obj1; MyClass<int> obj2;
obj1.print(); obj2.print();
return 0;}Вывод
Generic templateSpecialized template for intВ этом примере MyClass имеет общую реализацию и специализированную реализацию для типа int.
Частичная специализация
Частичная специализация позволяет определить реализацию шаблона для частично конкретизированных типов.
Пример частичной специализации
#include <iostream>
template <typename T1, typename T2>class MyClass {public: void print() { std::cout << "Generic template" << std::endl; }};
template <typename T>class MyClass<T, int> {public: void print() { std::cout << "Partially specialized template for second type int" << std::endl; }};
int main() { MyClass<double, double> obj1; MyClass<double, int> obj2;
obj1.print(); obj2.print();
return 0;}Вывод
Generic templatePartially specialized template for second type intВ этом примере MyClass имеет общую реализацию и частично специализированную реализацию, когда второй параметр является int.
Резюме
- Шаблоны позволяют создавать универсальные функции и классы, работающие с различными типами данных.
- Функции-шаблоны позволяют писать функции, принимающие аргументы любого типа.
- Классы-шаблоны позволяют создавать классы, которые могут работать с различными типами данных.
- Полная специализация позволяет определить реализацию шаблона для конкретного типа.
- Частичная специализация позволяет определить реализацию шаблона для частично конкретизированных типов.