Ich versuche eine bequeme Möglichkeit zu finden, String-Literale als Template-Argumente zu übergeben. Ich sorge mich nicht darum, die größtmögliche Anzahl von Compilern zu unterstützen, ich benutze die neueste Version von g ++ mit --std=c++0x
.
Ich habe viele mögliche Lösungen ausprobiert, aber alle haben mich enttäuscht. Ich gebe auf, aber zuerst würde ich gerne wissen, warum ein paar von ihnen versagt haben.
Hier sind sie:
%Vor%Und:
%Vor%Das Ziel war es, eine bequeme Möglichkeit zu finden, ein String-Literal an die nutzlose Get-Funktion zu übergeben, die ihr Template-Argument als std :: string-Objekt zurückgibt.
EDIT: Entschuldigung, vielleicht ist meine Hauptfrage nicht klar. Meine Frage ist: Warum scheitern diese beiden Schnipsel?
re: Ihr OP: I'd like to know why a couple of them failed.
Der Kommentar von @NatanReed ist korrekt:
Get
ein TYPE
benötigt und ein object
. reference to an object
legal. Template-Argumente müssen Konstanten aus einer begrenzten Menge von Typen sein.
Und selbst dann muss String constexpr str = "hello";
eine externe Verknüpfung haben. Es wird also nicht funktionieren, es in main()
auf den Stack zu setzen.
Probieren Sie es aus:
%Vor%Sie können Zeichenfolgenliterale nicht als Vorlageargument für die einfacher Grund, dass es nicht angegeben ist, ob zwei Instanzen von a Literal mit demselben Text sind das gleiche Objekt oder nicht. In anderen Wörter, gegeben:
%Vor% Es wäre nicht spezifiziert, ob v1
und v2
denselben Typ hätten
oder nicht.
Sie können char const[]
Variablen als Vorlagenargumente verwenden,
Sie haben jedoch eine definierte Adresse:
In diesem Fall ist v1
und v2
garantiert gleich
Geben Sie ein.
BEARBEITEN:
Ich denke, C ++ 11 beseitigt die Notwendigkeit für die extern
auf der
Definition der Zeichenfolge, zumindest wenn die Zeichenfolge und die
Instanziierung sind alle in der gleichen Übersetzungseinheit. Ich bin nicht
sicher aber; Das eine Mal, als ich so etwas gemacht habe, tat ich es nicht
Zugriff auf C ++ 11 haben.
Sie können Zeichenfolgen mit C ++ 11 variadischen Vorlagen "simulieren":
%Vor%Dies druckt:
Hallo Welt !!!
Ich weiß, dass der Beitrag alt ist, aber ich habe hier keine Lösung für dieses Problem gefunden, und vielleicht wäre jemand an meinem Workaround interessiert:
%Vor%Jetzt Verwendung:
%Vor%Leider muss man die Länge des Strings angeben, damit es funktioniert, aber es ist immer noch komfortabler als die einfache Variante von chars, und die Länge wird durch static_assert verifiziert, so dass der Compiler helfen kann, den richtigen Wert auszuwählen. .
Bearbeiten
Noch eine Zaubervorlage. Dieser verwendet Kurzschluss, um die String-Größe von der STRING_LITERAL-Deklaration (c ++ 17) loszuwerden:
%Vor%