Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Инстанцирование шаблонов в C++: как появляется конкретный тип

💻 Информатика · 11 класс

Инстанцирование шаблона — получение конкретной специализации функции или класса при подстановке аргументов шаблона. Шаблон задаёт общее описание, а использование с определённым тип

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Инстанцирование шаблона — получение конкретной специализации функции или класса при подстановке аргументов шаблона. Шаблон задаёт общее описание, а использование с определённым типом позволяет компилятору проверить соответствующий вариант. Не путайте этот процесс с созданием обычного объекта уже известного класса.

От шаблона к конкретной функции

Учебный пример: template<class T> T twice(T x) { return x + x; }. При вызове twice(4) тип параметра выводится как int, и используется вариант для целого числа. Вызов twice(2.5) связан с double. Это один исходный алгоритм, но требования проверяются для конкретных типов.

Обобщённость не означает допустимость любого типа. Внутри функции используется операция сложения. Если для переданного типа подходящего + нет, соответствующая специализация не станет корректной только потому, что определение шаблона раньше было принято компилятором. Проверять нужно не только заголовок, но и операции в теле.

Пример с классом

Запись template<class T> struct Box { T value; }; задаёт семейство классов. Box<int> и Box<double> — разные конкретные типы. Команда Box<int> a{7}; создаёт объект первого типа. Здесь выбор специализации и создание объекта — два разных уровня рассуждения.

Для неявного инстанцирования важен контекст использования: когда требуется полностью определённый тип, компилятору нужно его описание. Объявление указателя и создание объекта не всегда требуют одинакового объёма информации. На начальном уровне достаточно помнить: «я упомянул имя» и «мне требуется полное устройство объекта» — не равнозначные действия.

Явное и неявное использование

Чаще всего начинающий встречает неявное инстанцирование: компилятор получает нужный вариант из обычного использования шаблона. Существуют и специальные явные объявления инстанцирования, применяемые при организации больших программ. Они не равны явной специализации: специализация позволяет задать отдельное определение поведения, а инстанцирование использует уже описанный шаблон.

Не стоит начинать с распределения шаблонов по нескольким файлам без понимания видимости определения. Типичная ошибка — объявить шаблон в одном месте, спрятать его определение в другом и ожидать, что любой исходный файл сможет получить новый вариант. Для первого опыта держите небольшой шаблон и его вызовы в одном учебном файле.

Задания и объяснения

1. Какие типы выводятся в twice(3) и twice(3.0)? Ответ: int и double. 2. Является ли Box<int> тем же типом, что Box<double>? Нет. 3. Почему функция с x + x не обязана работать для произвольного пользовательского класса? Для него может не существовать соответствующей операции.

Проверяйте сообщения компилятора по цепочке: какой аргумент подставлен вместо T, какая операция понадобилась и почему её нельзя выполнить. Это полезнее, чем механически менять слово class на typename: в данном объявлении параметра оба варианта не решают ошибку отсутствующей операции.

Связанные материалы

Начала программирования, Алгоритмы: основа программирования и не только.

Источники и проверка

Рабочий проект стандарта C++: implicit instantiation.

Источники и материалы