Перейти до основного вмісту
Модуль 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, компілятор може вивести його в деяких контекстах за допомогою Виведення аргументів шаблону класу або 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, який містить приватний член з іменем значення типу 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 спроб