Лекция 9. Метапрограммирование в С++
ฝัง
- เผยแพร่เมื่อ 10 ก.พ. 2025
- На 9 лекции вы узнаете:
• Введение в метапрограммирование
• Основные аспекты шаблонов: шаблонные функции, шаблонные классы, полная и частичная специализация, вариативные шаблоны, свертка
• Вычисления на этапе компиляции
• Манипуляция с типами на этапе компиляции
• Curiously recurring template pattern
• SFINAE
Презентацию лекции можно скачать по ссылке: clck.ru/368LKJ
-----------------------------------------------------------------------------------------------------------------
Курс подготовлен командой PVS-Studio. Приглашаем на сайт pvs-studio.com познакомиться со статьями, посвященными статическому анализу и практикам написания качественного надёжного кода.
----------------------------------------------------------------------------------------------
Twitter: / pvsstudio_rus
Instagram: / pvsstudio_rus
Vk: pvsstud...
Telegram: t.me/pvsstudio...
Facebook: / staticcodeanalyzer
самые понятные лекции, круто)
интересно и полезно, спасибо!
наконец то )) а то предыдушие лекции чуть не сдох ))
Поражаюсь маленькому количеству просмотров. Нэверю. В топ однозначно.
В функции вычисления всех простых чисел на 40:00 нет необходимости идти на ухищрения для инициализации массива в компайл-тайм. Достаточно использовать zero-initialization:
template
constexpr auto eratosthenes_sieve()
{
std::array primes{};
for (size_t i = 2; i < N + 1; ++i)
primes[i] = true;
for (size_t i = 2; i * i
Можно и так. Ваш пример более читабельный и простой. Главное сохранять баланс между читабельностью и производительностью: весь этот код будет происходить на этапе компиляции. Ведь если таких вычислений много, то компиляция затянется.
По идее, в приведенном примере 'constexpr'-эвалюатор сначала заполнит весь массив нулями (false'ами), а затем, начиная с третьего элемента (индекс 2), заполнит массив повторно единицами (значениями 'true').
В исходном варианте инициализация происходит при объявлении. По идее, компилироваться должно пошустрее. Плюс показана такая штука, как std::integer_sequence
22:05 на слайде во время объяснения шаблона с переменным числом параметров перепутали местами 42 и 0.0
Верно. Спасибо за комментарий. Баги встречаются)
@@PVSStudioTool В лекции не хватает перед блоками введения. Например, было бы неплохо перед примерами рассказать про идеи, которые заложены в SFINSE, CRTP, Детекторы...
а можно это всё сделать как-то попроще? А то намудрили... Ой... Я вспоминаю C# так там всё проще: просто ваш класс должен наследоваться от соответствующего интерфейса... И усё!!! И они все так... А тут почему так сложно?! Непонятно...
Как сказал один мудрец в комментах к нашим видео: th-cam.com/video/KPuYn_fUdxc/w-d-xo.html&lc=UgzLW5kC9kcDdEY49U94AaABAg
А человек не будет развиваться если не давать ему нагрузку на мозг. Если не тренировать мозги то он будет деградировать а потом альцгеймер и усё человек уже и не человек, а растение...
Вот метапрограммирование в C++ и помогает бороться с Альцгеймером :)
42:31 Вывод конечно отвратительный! Видно идея использовать тут array была явно дебильской... Если такое написать в проекте, то вас точно попросят переписать в виде вектора простых чисел... Потому что булевый массив в котором надо проверять каждый раз true там или false и ещё индексироваться нафик никому не нужен! Трудно было придумать что-то более неудобное, чем это...
Да есть алгоритм Brian Kernighan он простой, будет компилиться быстрее!
constexpr uint8_t popcount(uint64_t value) noexcept {
uint8_t res = 0;
for(; value; ++res) {
value &= value-1;
}
return res;
}