Лекция 9. Метапрограммирование в С++

แชร์
ฝัง
  • เผยแพร่เมื่อ 16 ต.ค. 2024
  • На 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

ความคิดเห็น • 13

  • @noname_2108
    @noname_2108 ปีที่แล้ว

    интересно и полезно, спасибо!

  • @компаниядоставкиЕдадомой.ру

    самые понятные лекции, круто)

  • @danquimby8317
    @danquimby8317 4 ปีที่แล้ว

    наконец то )) а то предыдушие лекции чуть не сдох ))

  • @MrDimonsky
    @MrDimonsky 2 ปีที่แล้ว

    Поражаюсь маленькому количеству просмотров. Нэверю. В топ однозначно.

  • @theK0sh
    @theK0sh 4 ปีที่แล้ว +1

    В функции вычисления всех простых чисел на 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

    • @PVSStudioTool
      @PVSStudioTool  4 ปีที่แล้ว +1

      Можно и так. Ваш пример более читабельный и простой. Главное сохранять баланс между читабельностью и производительностью: весь этот код будет происходить на этапе компиляции. Ведь если таких вычислений много, то компиляция затянется.
      По идее, в приведенном примере 'constexpr'-эвалюатор сначала заполнит весь массив нулями (false'ами), а затем, начиная с третьего элемента (индекс 2), заполнит массив повторно единицами (значениями 'true').
      В исходном варианте инициализация происходит при объявлении. По идее, компилироваться должно пошустрее. Плюс показана такая штука, как std::integer_sequence

  • @eugenesasin2757
    @eugenesasin2757 4 ปีที่แล้ว +1

    22:05 на слайде во время объяснения шаблона с переменным числом параметров перепутали местами 42 и 0.0

    • @PVSStudioTool
      @PVSStudioTool  4 ปีที่แล้ว

      Верно. Спасибо за комментарий. Баги встречаются)

    • @eugenesasin2757
      @eugenesasin2757 4 ปีที่แล้ว

      @@PVSStudioTool В лекции не хватает перед блоками введения. Например, было бы неплохо перед примерами рассказать про идеи, которые заложены в SFINSE, CRTP, Детекторы...

  • @kpanat
    @kpanat ปีที่แล้ว

    а можно это всё сделать как-то попроще? А то намудрили... Ой... Я вспоминаю C# так там всё проще: просто ваш класс должен наследоваться от соответствующего интерфейса... И усё!!! И они все так... А тут почему так сложно?! Непонятно...

    • @PVSStudioTool
      @PVSStudioTool  10 หลายเดือนก่อน

      Как сказал один мудрец в комментах к нашим видео: th-cam.com/video/KPuYn_fUdxc/w-d-xo.html&lc=UgzLW5kC9kcDdEY49U94AaABAg
      А человек не будет развиваться если не давать ему нагрузку на мозг. Если не тренировать мозги то он будет деградировать а потом альцгеймер и усё человек уже и не человек, а растение...
      Вот метапрограммирование в C++ и помогает бороться с Альцгеймером :)

  • @kpanat
    @kpanat ปีที่แล้ว

    42:31 Вывод конечно отвратительный! Видно идея использовать тут array была явно дебильской... Если такое написать в проекте, то вас точно попросят переписать в виде вектора простых чисел... Потому что булевый массив в котором надо проверять каждый раз true там или false и ещё индексироваться нафик никому не нужен! Трудно было придумать что-то более неудобное, чем это...

  • @kpanat
    @kpanat ปีที่แล้ว

    Да есть алгоритм Brian Kernighan он простой, будет компилиться быстрее!
    constexpr uint8_t popcount(uint64_t value) noexcept {
    uint8_t res = 0;
    for(; value; ++res) {
    value &= value-1;
    }
    return res;
    }