Перейти к основному содержимому
Модуль 8 · Урок 2 из 218/18 в курсе~15 min
Уроки модуля (2/2)

Шаблоны классов

Как и функции, классы могут быть параметризованы по отношению к одному или нескольким типам данных. Это позволяет нам определять общие структуры данных (такие как списки, очереди, стеки или оболочки), которые работают с любым типом данных без дублирования кода.

Определение шаблона класса

Чтобы объявить шаблон класса, мы используем синтаксис template <typename T> непосредственно перед определением класса. Внутри класса мы можем использовать параметр типа T для определения переменных-членов, возвращаемых типов или параметров функции-члена.

C++
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):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

Специализация шаблона

Иногда нам нужно другое поведение шаблона класса, когда он создается с определенным типом. В этом случае мы определяем полную специализацию, используя синтаксис template <>, за которым следует определение класса, определяющее целевой тип:

C++
// 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");
    }
};

Попробуйте сами

Упражнение#cpp.m8.l2.e1
Попыток: 0Загрузка…

Объявите шаблон класса с именем Box, который содержит закрытый член с именем value типа T, конструктор, который его инициализирует, и общедоступный метод getValue() const, который возвращает значение.

Загрузка редактора…
Показать подсказку

Не забудьте добавить `template <typename T>` к объявлению класса Box.

Решение доступно после 3 попыток

Упражнение#cpp.m8.l2.e2
Попыток: 0Загрузка…

Объявите шаблон класса Wrapper<T> с открытыми данными-членами типа T, конструктором Wrapper(T d) и методом print(), который печатает данные в std::cout. Затем создайте полную специализацию для Wrapper<char>, где метод print() печатает символ, заключенный в одинарные кавычки (например, «A» вместо A).

Загрузка редактора…
Показать подсказку

Используйте `template <>`, чтобы указать полную специализацию `Wrapper<char>`.

Решение доступно после 3 попыток