Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Виведення Аргументів Шаблону Класу | Шаблони Класів
Шаблони C++

Виведення Аргументів Шаблону Класу

Свайпніть щоб показати меню

Можливо, ви вже використовували деякі з них, навіть не підозрюючи, що це шаблони, завдяки виведенню аргументів шаблону класу (CTAD).

Починаючи з C++17, можна скористатися виведенням аргументів шаблону класу (CTAD). Ця можливість дозволяє створювати екземпляри шаблонних класів без явного зазначення типів шаблону. Замість цього компілятор визначає типи на основі параметрів конструктора. Розглянемо кілька прикладів із використанням std::pair.

main.cpp

main.cpp

12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<int, char> my_pair(1, 'a'); std::cout << my_pair.first << " : " << my_pair.second << std::endl; }
Note
Примітка

Раніше це був єдиний спосіб створити екземпляр std::pair. Однак тепер можна опустити частину <int, char>. Спробуйте видалити її та запустіть код ще раз.

Виведення аргументів шаблону класу виконується лише у випадку, якщо список аргументів шаблону відсутній. Якщо список аргументів шаблону вказано, виведення не відбувається.

main.cpp

main.cpp

12345678
#include <iostream> #include <utility> // for std::pair int main() { std::pair<> my_pair(1, 'a'); // Error std::cout << my_pair.first << " : " << my_pair.second << std::endl; }

Під час створення об'єкта з одним аргументом, який відповідає певному типу шаблону класу, CTAD надає перевагу використанню цього типу безпосередньо, що спрощує створення екземплярів для користувацьких шаблонних класів. Наприклад, із шаблонним класом на кшталт Box користувачі можуть створювати його екземпляри без явного зазначення типів, якщо передають аргументи конструктору.

main.cpp

main.cpp

123456789101112131415
#include <iostream> template <typename T> class Box { T value; public: Box(T value): value(value) {} }; int main() { // No need to write Box<int> a{1}; Box a{1}; // Deduction: Box<int> Box b{a}; // Deduction: Box<int>, not Box<Box<int>> }

CTAD може спростити підтримку коду. Якщо базові типи змінюються, потрібно оновлювати менше коду, що зменшує ймовірність помилок.

vector.h

vector.h

12345678
template <typename T> class Vector3D { T x, y, z; public: Vector3D(T x, T y, T z) : x(x), y(y), z(z) {} }; Vector3D vec{1.0, 2.0, 3.0}; // CTAD deduces Vector3D<double>

Під час використання контейнерів або обгорток зі специфічними конструкторами CTAD може спростити код. Припустимо, у вас є власний клас Matrix або Vector, який обгортає базовий тип даних. Використання CTAD у цьому випадку допомагає забезпечити автоматичне виведення типу на основі наданих аргументів, що підвищує читабельність і гнучкість.

question mark

Що таке виведення аргументів шаблону класу (CTAD)?

Виберіть правильну відповідь

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 3. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 3. Розділ 4
some-alt