Лекция 13

30.04.2025 Обновлено: 30.04.2025

Compile-time evaluation

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

Template Specialization

В зависимости от порядка функций, специализация шаблона может относиться к разным функциям. Например:

  • Если у нас сначала шаблон по T*, а потом специализация для int* — выбирается int* (более специфичная).
  • Если же сначала специализировать T как int*, а потом написать функцию для T* — выбирается более общий вариант, как более «удачный».

Пишем свой is_same

template<typename T, typename U>
struct is_same {
    static constexpr bool value = false;
};

template<typename T>
struct is_same<T, T> {
    static constexpr bool value = true;
};

По дефолту — false. Специализация для одинаковых типов — true.

Пишем identity

Фокус: в шаблоне принимаем тип T, а потом значение T value — внутри структуры лежит это же значение. Можно сделать инкремент — внутри хранить T value + 1.

Если положить в шаблон сразу auto — не надо указывать тип:

template<auto Value>
struct identity {
    static constexpr auto value = Value;
};

А если сделать снаружи constexpr переменную, которая держит value от структуры — не нужно писать ::value.

Метафункции, возвращающие типы

  • Просто пишем using внутри структуры.
  • Возвращается тип — а значит, его можно положить в другой шаблон.
template<typename T>
struct type_identity {
    using type = T;
};