Магистерский курс C++ (МФТИ, 2022-2023). Лекция 2. Шаблоны функций.

preview_player
Показать описание
Лекции в магистратуре МФТИ по современному C++ на русском языке. Кафедра микропроцессорных технологий.

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

Лектор: Константин Владимиров.
Дата лекции: 14 сентября 2022 года.
Съёмка и звук: Юлий Тарасов.

Timeline:
00:00 Обобщённое программирование
16:20 Инстанцирование
26:00 Специализация
40:43 Non-type параметры
47:20 Вывод типов в шаблонах
59:30 Перегрузка
01:12:57 Цепочки преобразований
01:19:12 Обзор литературы

Errata:
* тут пока пусто
Рекомендации по теме
Комментарии
Автор

Уровень знания C++ - джун/миддл/сеньер/гуру/сидишь вечером один, читаешь стандарт и смеёшься

Минтай-цт
Автор

Смотрю N-ое видео от Константина по шаблонам. "Ну теперь-то я точно всё пойму." Где-то на тайминге в 1 час: "Так. Что? Перематываем в начало..."

OlxHd
Автор

Спасибо за все ваши видео с лекциями! Предоставляете редкую возможность на самообразование. Мегамегамощь! Спасибо!

moddardtan
Автор

Отличная лекция, очень понятно объясняете! База, которую надо знать. Спасибо!

Batters
Автор

Слушаю лекции перед сном, чтобы от такого большого потока информации, которую нужно обработать, мозг перегрелся и вошёл в аварийную гибернацию. =)

deleteddeleted
Автор

Очень полезный материал, спасибо большое за то что делитесь с нами.

vladalu
Автор

про гетерогенный максимум:
1) если он consteval, то consteval auto max(T lhs, U rhs) { if constexpr(lhs < rhs) return rhs; else return lhs; }
2) вернуть std::variant<T, U>
3) вернуть std::common_type<T, U>

sigasigasiga
Автор

Каждый раз во время викторины всё больше ужасаешься языку и всё больше хочется досмотреть до конца.

АлександрШепель-му
Автор

Спасибо за лекцию.
Комментарий насчёт первого примера, возведение в степень:
Вы сразу же отмели наивный способ возведения в цикле. Но у этого способа есть одно неоспоримое преимущество - алгоритм работает для любого типа, для которого определена операция умножения, при этом никакие traits или инциализирующее значение для acc не нужны.

СергейСергей-ччй
Автор

1:12:31 На, возможно, нечто похожее есть мозговыносная лекция 03. Type loopholes in C++, Убербаг уровня стандарта – Антон Квятковский

DARTWADER
Автор

1:11:04 Константин, эту проблему решили в С++20 (P0846R0: ADL and Function Templates that are not Visible)

ddvamp
Автор

01:05:02. Здравствуйте, дополнение. Если теперь мы хотим использовать foo, как структуру, потому что foo(s) теперь является вызовом функции, то нужно написать struct foo(s)

dmitrydemis
Автор

35:25 -- ну тут я думаю достаточно простой пример все же -- поскольку вызывая extern ты заверяешь компилятор, что где то там есть инстанцирование -- и он воспринимает енто за чистую монету, как если бы инстанцирование было на месте данного extern -- а коль енто так, то специализация следом ведет к ентой самой ошибке.

safocl
Автор

1:03:48 я везде свой код переписал на static inline. В некоторых случаях помогло удалить ненужные dummy.cpp с объявлениями статических полей.

DARTWADER
Автор

acc=1;
Можно заменить на acc = x/x;
раз есть оператор*, можно надеяться и на обратный ему оператор/

subzerod
Автор

Константин, спасибо за материал!
Кажется, разделе про NTTP вы не упомянули указатели на члены класса, а это тоже интересное использование.

yogthemuskrat
Автор

Здравствуйте! Спасибо за лекцию. Вопрос про реализацию оператора сравнения строк (1:01). Будет ли правильной реализация не через специализации, а с использованием string_view?

vladbelousov
Автор

А можете пожалуйста дать подсказку как найти пункт в стандарте который отражает инстанцирование шаблона при extern декларации, после чего нельзя делать специализацию?

rouchy_
Автор

добрый день, а можно как нибудь сделать видео про варианты замены дефайнов для генерации разного кода?
Ну например, в зависимости от ОС, или включения определенных компонентов программы.
Просто получаетя, что с модулями енто невозможно теперь.

Из предполагаемых мной вариантов можно применять меташаблонные функции (классы, структуры). Но возможно есть уже варианты более выгодных способов?

safocl
Автор

37:15 "extern template означает не инстанцировать вообще ничего".

Возникает резонный вопрос. Если extern template не инстанцирует ничего, то как остальные единицы трансляции найдут инстанцированное тело функции при линковке? Ведь явное инстанцирование, а значит и само скомпилированное тело функции, лежит в отдельном .cc файле, и при линковке это тело надо как-то найти, а значит остальным единицам трансляции на этапе компиляции должен быть виден прототип этой функции. А шаблоны – это механизм самого компилятора, и к линковке отношения не имеет. Из такой логики, как и из самого синтаксиса, extern template больше выглядит как инстанцирование прототипа функции, а не отсутствие инстанцирования в принципе. Или я где-то не прав?

danielkeehl