Metaprogramming

среда, апр. 30, 2025 | 2 минуты чтения

Metaprogramming

Compile-time evaluation

  • Шаблончик работает как приём аргументов
  • Экономим на времени в рантайме
  • Только все данные для вычисления уже должны быть известный до компиляции

constexpr

  • Позволяет функции или переменной быть вычисленной в compile-time

  • Если есть возможность в compile-time, то там и вычислится, а иначе в ран-тайме

  • constexpr variable

    • Литеральный тип
    • Инициализация через константное выражение (явно, constexpr функция и тд)
  • constexpr function

    • Возвращает литеральный тип
    • Содержит переменные литеральных типов
    • Не виртуальная
    • Без исключений и тд
  • Теперь достаточо просто написать слово constexpr, а не все эти изощрения с enum

Template Specialization

  • В примере в зависимости от порядка функций специализация шаблона является специализацией разных функций. Если мы специализируем тип Т* типом int*, то выберерется int*, а вот если мы специализируем тип T, как int*, а потом напишем функцию для Т*, то выберется последний вариант, как самый удобный

  • Пишем свой is_same

    • пишем по дефолту static constexpr = false
    • Пишем специализицию для одинаковых типов, где эта переменная уже будет равна true
  • Пишем idetity

    • фокус: в шаблоне пишем аргумент Т, а потом Т value, а внутри структуры будет лежать это же значение

    • Также можно сделать инкремент, написав +1

    • А возьмём и кладём auto прямо в шаблоне, и нам круто, не надо указывать ти

    • А теперь возьмём и напишем constexpr переменную, которая будет держать value от нашей структурки, а теперь не надо писать value

  • Metaprogramming функции могут возвращать типы

    • просто пишем через юзинг
    • возвращает тип, поэтому можно положить в другой шаблончик