L' template <auto>
fonctionnalité (P0127R1) a été acceptée en C++ dans l'ISO C++ 2016 réunion à Oulu, en Finlande.
Un auto
mot-clé dans un paramètre de modèle peut être utilisé pour indiquer une non-type de paramètre le type de qui est déduite au moment de l'instanciation. Il aide à penser à cela comme un moyen plus pratique de l'écriture:
template <typename Type, Type value>
Par exemple,
template <typename Type, Type value> constexpr Type constant = value;
constexpr auto const IntConstant42 = constant<int, 42>;
peut maintenant être écrite comme
template <auto value> constexpr auto constant = value;
constexpr auto const IntConstant42 = constant<42>;
où vous n'avez pas besoin de préciser le type de plus. P0127R1 comprend également quelques simples mais bons exemples où l'utilisation d' template <auto>
avec variadic paramètres du modèle est très pratique, par exemple pour les implémentations de la compilation des listes de valeurs constantes:
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>;
En pré-C++1z, tout en HomogenousValueList
pourrait être simplement écrit que
template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;
l'écriture d'un équivalent de HeterogenousValueList
ne serait pas possible sans emballage les valeurs de certains autres modèles, par exemple:
template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
constant<char, 'X'> >;