
Дописываем тюпл!!!!
Getter
- Делаем шаблонную рекурсию
template<size_t N, typename Head, typename... Tail> struct Getter<N, Head, Tail...> { using value_type = Getter<N-1, Tail...>::value_type; }; template<typename Head, typename... Tail> struct Getter<0, Head, Tail...> { using value_type = Head; };- В шаблоничке лежит число-индекс элемента из
tuple- как всегда делаем шаблончик, потом специализация с откусывание одного элемаента
- отдельная специализация для элемента 0 - конец рекурсии
- Когда доходим до нолика, значит дошли до нужного значения и можем возвращать
t
- СЛишком громозко
- Не хочется перечислять все типы в
tuple - А сможет ли функция сама задедадктить из
tupleаргументы? CTADне можем, отому что для этого нужен конструткор- Тогда попробуем
TAD- Сделаем шаблонную функцию, которая будет протягивать типы
- Просто вызовем в ней геттер от нужного
tuple - засчёт шаблона
tupleкомпилятор задедактит аргументы геттера
- Сделаем функцию
make_tuple, которая сама задедактит все типы дляtupleи будет счастье
- Не хочется перечислять все типы в
Как вывести тип для конструирования вектора, если мы его будем конструировать от итераторов
Можно делать подсказки внутри функций для компилятора (см слайд)
overload Pattern
(было раньше)
Делали класс, в который клали 2 лямбды, а потом использовали оператор() от обеих этих лямбд
Засчёт того, что они принмают разные типы аргументов, Выбирался тот тип скобочек, который нужен
Теперь можем делать также, но уже с целым списком аргументов
std::variant
- Строго типизированный union(в отличие от структуры хранит одно из полей)
- Решает проблему union в том, что нужно всегда помнить тип
- Типичное использование:
- Конструктор понимает, какой тип мы в него кладём
- Не кастит типы
- в гете прописываем тип, который там лежит и хоти достать
- если там лежит инт(11), то достать лонг не получится (не кастит никак)
std::visit
- Мёрджим оператор паттерн и
std::variant - Вызываем
std::visitотoverload pattern-класса иstd::variant, и тогда вызовется функция под тот тип, который лежит вstd::variant
Подумать, хау ит ворк
Variadic CRTP (см слайдик)
- Берём дерайвд, наследуем от бейз, но по шаблону дерайвд
- Теперь хотим делать также, но теперь от нескольких аргументов
- Наследуем класс от класса, который наследует сам класс, тогда и тут прописываем шаблоны
- из-за того, что там классы тоже шаблонные, то в шаблоне надо указать, что аргументы шаблонные ( просто ставим < typename >……)
МЕТАПРОГРАММИРОВАНИЕ ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫАААААААААААААААААААА
Compile-time evaluation- Шаблончик работает как приём аргументов
- Экономим на времени в рантайме
- Только все данные для вычисления уже должны быть известный до компиляции
constexpr
Позволяет функции или переменной быть вычисленной в
compile-timeЕсли есть возможность в
compile-time, то там и вычислится, а иначе в ран-таймеconstexpr variable- Литеральный тип
- Инициализация через константное выражение (явно,
constexprфункция и тд)
constexpr function- Возвращает литеральный тип
- Содержит переменные литеральных типов
- Не виртуальная
- Без исключений и тд
Теперь достаточо просто написать слово
constexpr, а не все эти изощрения сenum