72 votes

Avantages de l'auto dans les paramètres de modèle en C ++ 17

Quels sont les avantages des paramètres de modèle auto qui seront (éventuellement) introduits avec C ++17?

Est-ce juste une extension naturelle de auto lorsque je veux instancier du code de template?

 auto v1 = constant<5>;      // v1 == 5, decltype(v1) is int
auto v2 = constant<true>;   // v2 == true, decltype(v2) is bool
auto v3 = constant<'a'>;    // v3 == 'a', decltype(v3) is char
 

Que puis-je gagner de cette fonctionnalité de langue?

95voto

mceo Points 716

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'> >;

14voto

m-j-w Points 172

En réalité, le cas des valeurs réelles dans la réponse de mceo (originale) n'est explicitement pas couvert en tant que paramètre de modèle non typé.

 template <auto ... vs> struct HeterogenousValueList {};
using MyList1 = HeterogenousValueList<42, 'X', 1.3f>;
 

Voir l'exemple donné dans la proposition mentionnée: Modifier le paragraphe 14.3.2, paragraphe 2:

 template<auto n> struct B { /* ... */ };
B<5> b1;   // OK: template parameter type is int
B<'a'> b2; // OK: template parameter type is char
B<2.5> b3; // error: template parameter type cannot be double
 

Je suis tombé sur la même idée fausse moi-même il y a quelques jours.

7voto

Amir Kirsh Points 1264

Voici un autre exemple ( présenté à l'origine par @ Rakete1111 en tant que réponse pour le paramètre de modèle de modèle de type inconnu ):

Extraire la valeur de SIZE sans connaître son type:

 template<std::size_t SIZE>
class Foo {};

template <template<auto> class T, auto K>
auto extractSize(const T<K>&) {
    return K;
}

int main() {
    Foo<6> f1;
    Foo<13> f2;
    std::cout << extractSize(f1) << std::endl;
    std::cout << extractSize(f2) << std::endl;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X