+7 (812) 703-02-02 info@hse.spbstu.ru

DEV-C221. Прикладное программирование с использованием стандартов С++11, 14, 17, 20, 23. Часть 2

Длительность дисциплины: 44 ак.ч.


Аннотация

Целью реализации модуля «DEV-C221. Прикладное программирование с использованием стандартов С++11, 14, 17, 20, 23. Часть 2» является углубленное изучение слушателями новых концепций и программных средств, добавленных в язык программирования С++ согласно стандарту С++11 (С++14, 17, 20, 23), а также приобретение практических навыков по применению новых средств при решении прикладных задач.


Знания и умения, полученные в результате изучения

В результате освоения модуля обучающийся должен уметь:
•    использовать новые средства С++, предоставляемые ядром языка и стандартной библиотекой согласно стандартам С++11, 14, 17, 20, 23, такие как универсальные ссылки, variadic_templates, свертки, tuples, function, variant, диапазоны (ranges), модули.

В результате освоения модуля обучающийся должен знать:
•    средства С++ для продвижения типов (forward);
•    понимать внутреннюю реализацию шаблонов с переменным числом параметров;
•    приемы программирования с использованием диапазонов;
•    обобщение действий посредством шаблона function.

В результате освоения модуля обучающийся должен приобрести практический опыт:
•    разработки прикладного ПО на языке С++ с использованием новых стандартов языка С++.

Содержание дисциплины

Тема 1. Универсальные ссылки (forwarding reference). Механизм forward
1.1    Понятие универсальной ссылки.   
    Цель введения универсальных ссылок.
    Отличия от rvalue reference.
1.2    Шаблон forward<>   
    Реализация шаблона forward<> в стандартной библиотеке.
    Как происходит восстановление типа.
Практические занятия   
1. Использование шаблона forward<> при решении прикладной задачи

Тема 2. Шаблоны с переменным числом параметров (variadic_templates).
2.1    Понятие шаблона с переменным числом параметров (variadic template)    
    Синтаксис объявления шаблонов с переменным числом параметров.
    Реализация шаблонов функций с переменным числом параметров.
    Реализация шаблонов классов с переменным числом параметров.
2.2    Шаблон function, шаблон bind.
    Кортежи (tuple)    Реализация шаблона function.
    Примеры использования.
    Реализация шаблона bind.
    Примеры использования.
    Лямбда выражения vs bind.
    Реализация шаблона tuple.
    Примеры использования.
2.3    Свертка параметров шаблона (fold-expression)   
    Виды сверток.
    Специфика использования.
    Примеры использования.
Практические занятия   
1.    Реализация пользовательских шаблонов функций и классов с переменным числом параметров.
2.    Использование шаблона function
3.    Использование шаблона tuple
4.    Использование fold-expression

Тема 3. Перегрузка и универсальные ссылки. SFINAE
3.1    Реализация шаблонного конструктора, принимающего в качестве параметра универсальную ссылку   
    Пример проблемы, возникающей при использовании универсальных ссылок для реализации конструктора.
3.2    Диспетчеризация дескрипторов   
    Прием, разрешающий проблему перегрузки.
    Использование if constexpr vs диспетчеризации
3.3    SFINAE   
    Понятие SFINAE.
    Технология disabled templates
    Механизм enable_if.
    Использование SFINAE для решения проблем перегрузки.
Практические занятия   
1. Использование SFINAE для решения проблемы перегруженных конструкторов

Тема 4. Исключения, static_assert
4.1    Проблемы обработки исключений   
    Отслеживание аварийных ситуация на этапе выполнения.
    Раскрутка стека при генерации исключения.
4.2    Средства для обработки (в частности межпоточных) исключений   
    Класс std::exception_ptr.
    Функции std::current_exception(),std::rethrow_exception()
4.3    static_assert    Проверки на этапе компиляции. Сравнение assert() и static_assert().
Практические занятия   
1.    Пример генерации исключения и обработки исключения.
2.    Использование static_assert

Тема 5. Шаблоны std::variant, std::optional, std::any
5.1    std::variant   
    Variant как безопасная альтернатива union.
    Специфика использования.
    Шаблоны глобальной функции visit(), holds_alternative(), get_if()
5.2    std::optional   
    Универсальная обертка для любого значения (в частности может не содержать никакого значения).
    Специфика использования.
    С++23 шаблоны and_then(), transform(), or_else()
5.3    std::any   
    Универсальное хранилище для любого копируемого объекта.
    Специфика использования.
    Шаблоны swap(), any_cast(), make_any()
Практические занятия   
1. Использование шаблонов std::variant, std::optional, std::any и средств манипулирования ими при решении практических задач.

Тема 6. Добавления в ядро языка и в стандартную библиотеку.
6.1    Выравнивание данных в памяти
    Неэффективность работы с невыровненными данными.
    Спецификатор alignas, оператор alignof.
6.2    Классы-обертки   
    string_view, array
6.3    Атрибуты   
    noreturn, carries_dependency, deprecated, nodiscard, fallthrough, maybe_unused
6.4    Расширение функциональности контейнеров стандартной библиотеки   
    Реализация методов emplace_*.
    В каких случаях можно достичь повышения эффективности за счет использования методов emplace_* по сравнению с push_*
Практические занятия   
1. Использование нововведений в практических заданиях
 
Тема 7. Концепты (concepts)
7.1    Понятие концепта   
    Отличие концептов и средств, предоставляемых стандартной библиотекой посредством <type_traits>.
    Виды концептов.
    Специфика.
    Варианты использования.
    Примеры использования
Практические занятия   
1. Применение концептов в практических задачах.

Тема 8. Диапазоны (ranges)

8.1    Актуальность диапазонов   
    Проблемы адаптации обобщенных алгоритмов стандартной библиотеки для нестандартных действий.
8.2    Понятие диапазона   
    Синтаксис.
    Специфика использования.
Практические занятия   
1. Пример использования

Тема 9. Работа с файлами и директориями
9.1    Состав Filesystem библиотеки   
    Классы: directory_options, directory_entry, directory_iterator…
    Глобальные функции: absolute(), rename(), remove()… 
Практические занятия   
1. Реализация поиска указанного файла в заданной директории (с учетом поддиректорий)

Тема 10. Регулярные выражения
10.1 Краткая теория регулярных выражений   
    Семантика формирования регулярных выражений
10.2 Средства, предоставляемые С++ для формирования и использования регулярных выражений   
    Классы: basic_regex, sub_match, match_results
    Алгоритмы: regex_match(), regex_search(), regex_replace()
    Итераторы: regex_iterator, regex_token_iterator
    Исключения: regex_error
Практические занятия   
1. Использование изученных средств для задач поиска

Тема 11. Промежуточная аттестация
Практические занятия    Зачет