wake-up-neo.com

Ist es in modernen C++ möglich, ein String-Literal als Parameter an eine C++ - Vorlage zu übergeben?

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() {

}
50
Bill Moore

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.

Bis Sie c ++ 20 erhalten und wenn Sie boost haben, kann das folgende Makro nützlich sein:

#define C_STR(str_) boost::mpl::c_str< BOOST_METAPARSE_STRING(str_) >::value

Dann wie folgt verwenden:

template<const char* str>
structe testit{
};
testit<C_STR("hello")> ti;
0
darune