Ist es in "modernem C++" (C++ 17 oder höher) möglich, ein String-Literal als Parameter an eine C++ - Vorlage zu übergeben?
Mir ist klar, dass Sie dies mit Konstruktorargumenten tun könnten. Ich dachte nur, es wäre bequemer, es als Template-Argument zu haben, anstatt tief in der CPP-Datei zu verankern. Ich war gespannt, ob dies eine neue Funktion des modernen C++ ist. Siehe Pseudo-Code unten, was ich versuche zu tun:
Pseudocode-Beispiel:
// Header File /////////////////////////
template<constexpr string Name>
class ModuleBase {
public:
ModuleBase();
string name;
};
class xyz : ModuleBase<"xyz"> {
public:
xyz();
};
// Cpp File //////////////////////////
template<string_literal Name>
ModuleBase<Name>::ModuleBase() {
name = Name;
}
xyz::xyz() : ModuleBase() {
}
Ja, in c ++ 20 .
Das Problem bestand darin, dass es schwierig war, die Eindeutigkeit eines Vorlagetyps zu ermitteln, der nicht vom Typ war.
c ++ 20 fügt einen <=>
-Raumschiffoperatorvergleich hinzu. Wenn es nicht vom Benutzer bereitgestellt wird (und nur auf dem nicht vom Benutzer angegebenen <=>
basiert, wiederholen Sie dies rekursiv.) (Und ein einige andere Anforderungen; siehe p0732 ), kann der Typ als Vorlagenargument ohne Typ verwendet werden .
Solche Typen können aus rohen "strings"
in constexpr
-Konstruktoren erstellt werden, einschließlich der Verwendung von c ++ 17 -Duktionshilfslinien, um sie automatisch in der Größe zu verändern.
Da die Größe der gespeicherten Daten wahrscheinlich Teil des Typs sein wird, sollten Sie den Typ als einen auto
-typisierten Nicht-Typ-Parameter oder einen anderen automatisch abgeleiteten Typ verwenden.
Beachten Sie, dass das Einfügen der Implementierung Ihrer Vorlage in eine CPP-Datei in der Regel eine schlechte Idee ist. Aber das ist eine andere Frage.