Sie müssen in der Lage sein, Template-Argumente zu manipulieren
template
void f() {
// ...
}
f<"foo">();
f<"foo">(); // gleiche Funktion?
Jetzt müsste eine Implementierung eine eindeutige Zeichenfolge für eine std::string
oder auch jede andere beliebige benutzerdefinierte Klasse erstellen, die einen bestimmten Wert speichert, dessen Bedeutung der Implementierung nicht bekannt ist. Und zusätzlich können die Werte von beliebigen Klassenobjekten nicht zur Übersetzungszeit berechnet werden.
Es ist geplant, die Verwendung von Literalklassentypen als Vorlagenparametertypen für Post-C++0x (siehe unten) zu erlauben, die durch konstante Ausdrücke initialisiert werden. Diese könnten durch eine rekursive Verschlüsselung der Datenelemente entsprechend ihrer Werte verschlüsselt werden (für Basisklassen können wir z.B. eine tiefenorientierte, von links nach rechts durchlaufende Traversierung anwenden). Aber es wird definitiv nicht für beliebige Klassen funktionieren.
Ab C++20 ist es nun erlaubt, strukturelle Klassentypen als Vorlagenparameter zu verwenden. Im Wesentlichen müssen strukturelle Klassen einen constexpr
-Konstruktor, Destruktor und nur strukturelle Typen von Elementen und Basisklassen (wie Skalare, Arrays davon oder Referenzen) haben. Sie dürfen auch nur öffentliche und nicht mutable
Basisklassen und Elemente haben. Diese Bestimmungen ermöglichen es dem Compiler, das Argument sinnvoll zu verschlüsseln, wenn die Vorlage mit einem in den Parametertyp konvertierten konstanten Ausdruck instanziiert wird.
21 Stimmen
Ein Vorlagenparameter wird zur Kompilierzeit aufgelöst.