
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 функции могут возвращать типы
- просто пишем через юзинг
- возвращает тип, поэтому можно положить в другой шаблончик