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