C++-Tricks: auto als Non-Type-Templateparameter

Der Platzhalter auto als NTTP bewirkt, dass der Typ des entsprechenden NNTPs automatisch abgeleitet wird. Dadurch vereinfachen sich Templates.

Artikel verschenken
In Pocket speichern vorlesen Druckansicht
C++-Tricks: auto als Non-Type-Templateparameter
Lesezeit: 12 Min.
Von
  • Andreas Fertig
Inhaltsverzeichnis
Mehr zur Programmiersprache C++

C++ kennt zwei verschiedene Arten von Templateparametern: Typ und Nichttyp. Ein Nichttypparameter wie der Non-Type-Templateparameter, kurz NTTP, ist immer ein konkreter Wert, meistens eine Zahl, aber auch Adressen, Funktionszeiger oder enum-Werte sind möglich. Ab C++20 können Entwickler auch float und eigene Klassen verwenden, solange diese bestimmte Bedingungen erfüllen.

Bei Type-Templateparametern erkennt der Compiler zur Kompilierzeit den Typ, lediglich bei expliziten Spezialisierungen gibt der Entwickler ihn direkt an. Bei Non-Type-Templateparametern ist im Templatekopf immer der Typ angeführt. Entweder ermittelt der Compiler den zugehörigen Wert oder der Entwickler setzt ihn wie bei den expliziten Spezialisierungen. Vor C++17 konnte der Compiler den Typ eines Non-Type-Templateparameters nicht ausfindig machen, das führte zu Duplikationen. Als Beispiel dient der Type Trait std::integral_constant, der zur Kompilierzeit verfügbare Typen mit einem Wert erstellt. Vor C++17 sah die Verwendung so aus:

constexpr std::integral_constant<decltype(10), 10> c1; 
constexpr std::integral_constant<bool, true> c2;
constexpr std::integral_constant<int, 'a'> c3;

Hier steht man vor der Wahl, entweder den korrekten Typ mit decltype zu ermitteln, wie in c1 gezeigt, oder ihn explizit anzugeben, wie es bei c2 der Fall ist. Beide Ansätze haben Nachteile: Es findet eine Wiederholung statt und damit eine Verletzung des DRY-Prinzips (Don’t repeat yourself). Die korrektere Variante mit decltype birgt den Nachteil, dass der Ausdruck sehr lang und damit unübersichtlich ist. Außerdem besteht die Gefahr, dass die Variable im decltype-Ausdruck eine andere ist als die des zweiten Parameters. Kleine Fehler passieren hier schnell.