Уроки модуля (2/2)
Шаблоны классов
Как и функции, классы могут быть параметризованы по отношению к одному или нескольким типам данных. Это позволяет нам определять общие структуры данных (такие как списки, очереди, стеки или оболочки), которые работают с любым типом данных без дублирования кода.
Определение шаблона класса
Чтобы объявить шаблон класса, мы используем синтаксис template <typename T> непосредственно перед определением класса. Внутри класса мы можем использовать параметр типа T для определения переменных-членов, возвращаемых типов или параметров функции-члена.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};Создание экземпляра
При создании объекта шаблона класса мы должны явно указать тип в угловых скобках <> (хотя, начиная с C++17, компилятор может вывести его в некоторых контекстах с помощью Class Template Argument Argument Deduction или CTAD):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleСпециализация шаблона
Иногда нам нужно другое поведение шаблона класса, когда он создается с определенным типом. В этом случае мы определяем полную специализацию, используя синтаксис template <>, за которым следует определение класса, определяющее целевой тип:
// Total specialization for the bool type
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "True" : "False");
}
};Попробуйте сами
Объявите шаблон класса с именем Box, который содержит закрытый член с именем value типа T, конструктор, который его инициализирует, и общедоступный метод getValue() const, который возвращает значение.
Показать подсказку
Не забудьте добавить `template <typename T>` к объявлению класса Box.
Решение доступно после 3 попыток
Объявите шаблон класса Wrapper<T> с открытыми данными-членами типа T, конструктором Wrapper(T d) и методом print(), который печатает данные в std::cout. Затем создайте полную специализацию для Wrapper<char>, где метод print() печатает символ, заключенный в одинарные кавычки (например, «A» вместо A).
Показать подсказку
Используйте `template <>`, чтобы указать полную специализацию `Wrapper<char>`.
Решение доступно после 3 попыток