Ответ 1
Функция template <auto>
(P0127R1) была принята на С++ на собрании ISO С++ 2016 в Оулу, Финляндия.
Ключевое слово auto
в параметре шаблона может использоваться для указания параметра non-type, тип которого выведен в момент создания. Это помогает думать об этом как о удобном способе написания:
template <typename Type, Type value>
Например,
template <typename Type, Type value> constexpr Type constant = value;
constexpr auto const IntConstant42 = constant<int, 42>;
теперь можно записать как
template <auto value> constexpr auto constant = value;
constexpr auto const IntConstant42 = constant<42>;
где вам больше не нужно явно указывать тип. P0127R1 также содержит некоторые простые, но хорошие примеры, где использование template <auto>
с параметрами вариационного шаблона очень удобно, например, для реализаций времени компиляции перечисляет постоянные значения:
template <auto ... vs> struct HeterogenousValueList {};
using MyList1 = HeterogenousValueList<42, 'X', 13u>;
template <auto v0, decltype(v0) ... vs> struct HomogenousValueList {};
using MyList2 = HomogenousValueList<1, 2, 3>;
В pre-С++ 1z, а HomogenousValueList
можно просто написать как
template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;
запись эквивалента HeterogenousValueList
невозможна без обертывания значений в некоторых других шаблонах, например:
template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
constant<char, 'X'> >;