Глава №13. Итоговый тест

  Юрий  | 

  |

  Обновл. 25 Мар 2021  | 

 17275

 ǀ   4 

Еще одна глава позади. Пора закрепить пройденный материал.

Теория

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

Все шаблоны функций или классов должны начинаться с ключевого слова template и объявления параметров шаблона. В объявлении параметров шаблона указываются параметры типа и параметры non-type.

Параметр типа шаблона — это параметр, который отвечает за типы данных, с которыми будет работать шаблон, обычно его называют T, T1, T2 или другими (одиночными) буквами (например, S).

Параметром non–type может быть переменная интегрального типа данных (например, char, bool, int, long, short), указатель/ссылка на функцию или на метод/объект класса, std::nullptr_t.

Разделение определения шаблонов класса и его методов по разным файлам не работает как с обычными классами — вы не можете поместить определение шаблона класса в заголовочный файл, а определение шаблонов методов этого класса в отдельный файл .cpp. Как правило, лучше всё хранить в заголовочном файле с определениями шаблонов методов под определением шаблона класса.

Явная специализация шаблона используется для определения реализации, отличающейся от общей, функции или класса при работе с определенным типом данных. Если все параметры специализации шаблона явно определены, то это полная специализация. Классы также поддерживают частичную специализацию, при которой не все параметры шаблона должны быть явно определены. В C++14 частичная специализация шаблонов функций запрещена.

Многие классы в Стандартной библиотеке C++ (такие как std::array и std::vector) используют шаблоны. Шаблоны часто применяются для реализации контейнерных классов, которые можно один раз написать и использовать с любыми типами данных.

Тест


Задание №1

Предположим, что нам нужно передавать данные парами. Реализуйте шаблон класса Pair1, который позволяет пользователю передавать данные одного типа парами. Следующий код:

Должен выдавать следующий результат:

Pair: 6 9
Pair: 3.4 7.8

Ответ №1

Задание №2

Реализуйте класс Pair, который позволяет пользователю использовать разные типы данных в передаваемых парах. Следующий код:

Должен выдавать следующий результат:

Pair: 6 7.8
Pair: 3.4 5

Подсказка: Для определения шаблона с использованием двух разных типов, просто разделите параметры типа шаблона запятой.

Ответ №2

Задание №3

Напишите шаблон класса StringValuePair, в котором первое значение всегда является типа string, а второе может быть любого типа. Этот шаблон класса должен наследовать частично специализированный класс Pair (в котором первый параметр типа std::string, а второй — «любой тип данных»). Следующий код:

Должен выдавать следующий результат:

Pair: Amazing 7

Подсказка: При вызове конструктора класса Pair из конструктора класса StringValuePair, не забудьте указать, что параметры относятся к классу Pair.

Ответ №3

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (108 оценок, среднее: 4,87 из 5)
Загрузка...

Комментариев: 4

  1. Константин:

    Ответ на 1-е задание:

    Ответ на 2-е задание:

    С 3-м заданием был затык с вызовом конструктора Pair, но в итоге
    разобрался:

  2. Илья:

    Мой вариант:

  3. kmish:

    В задании 3 написано: "Этот шаблон класса должен наследовать частично специализированный класс Pair". В оригинальном решении нет этого шаблона.
    Мой вариант:

    1. Kris:

      Дублирование кода — не есть хорошо. К тому же, в данном случае, абсолютно нету смысла в частичной специализации для string, ведь общий шаблон сгенерил бы абсолютно такой же код.

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *