webentwicklung-frage-antwort-db.com.de

Vorteile von Auto in Template-Parametern in C ++ 17

Was sind die Vorteile von auto in Template-Parametern, die (möglicherweise) mit C++ 17 eingeführt werden?

Ist es nur eine natürliche Erweiterung von auto, wenn ich Vorlagencode instanziieren möchte?

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

Was habe ich sonst noch von dieser Sprachfunktion?

50
Damian

Das template <auto> feature ( P0127R1 ) wurde beim ISO C++ 2016-Meeting in Oulu, Finnland, in C++ aufgenommen.

Ein Schlüsselwort auto in einem Vorlagenparameter kann verwendet werden, um einen nicht typisierten Parameter anzugeben, dessen Typ zum Zeitpunkt der Instanziierung abgeleitet wird. Es ist hilfreich, sich dies als eine bequemere Schreibweise vorzustellen:

template <typename Type, Type value>

Beispielsweise,

template <typename Type, Type value> constexpr Type constant = value;
constexpr auto const IntConstant42 = constant<int, 42>;

kann jetzt geschrieben werden als

template <auto value> constexpr auto constant = value;
constexpr auto const IntConstant42 = constant<42>;

wo Sie den Typ nicht mehr explizit buchstabieren müssen. P0127R1 enthält auch einige einfache, aber gute Beispiele für die Verwendung von template <auto> mit variablen Vorlagenparametern ist sehr praktisch, zum Beispiel für die Implementierung von Konstantenwerten für Listen zur Kompilierungszeit:

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

In Pre-C++ 1z kann HomogenousValueList einfach als geschrieben werden

template <typename T, T ... vs> struct Cxx14HomogenousValueList {};
using MyList3 = Cxx14HomogenousValueList<int, 1, 2, 3>;

das Schreiben eines Äquivalents von HeterogenousValueList wäre nicht möglich, ohne die Werte in einige andere Vorlagen einzufügen, zum Beispiel:

template <typename ... ValueTypes> struct Cxx14HeterogenousValueList {};
using MyList4 = Cxx14HeterogenousValueList<constant<int, 42>,
                                           constant<char, 'X'> >;
57
mceo

Tatsächlich wird der Fall realer Werte in der (ursprünglichen) Antwort von mceo ausdrücklich nicht als nicht typisierter Vorlagenparameter behandelt.

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

Siehe das im genannten Vorschlag angegebene Beispiel: Änderung von § 14.3.2 Absatz 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

Bin vor ein paar Tagen über das gleiche Missverständnis gestolpert.

10
m-j-w

Hier ist ein weiteres Beispiel (, das ursprünglich von @ Rakete1111 als Antwort auf Template-Template-Parameter von unbekannt präsentiert wurde Typ ):

Den Wert von SIZE extrahieren, ohne den Typ zu kennen:

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;
}
4
Amir Kirsh