String-Literale als Vorlagenargumente übergeben [duplizieren]

7

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?

    
Alberto La Rocca 03.08.2013, 10:25
quelle

4 Antworten

3

re: Ihr OP: I'd like to know why a couple of them failed.

Der Kommentar von @NatanReed ist korrekt:

  • Ihr erstes Snippet schlägt fehl, weil Get ein TYPE benötigt und ein object .
  • erhalten wird
  • Ihr zweites Snippet schlägt fehl, weil es illegal ist, ein Template-Argument als Referenz auf ein Objekt zu definieren.
    • bis C ++ 2003, das ist. Dann wurde reference to an object legal.

Template-Argumente müssen Konstanten aus einer begrenzten Menge von Typen sein.

  • Siehe: ISO / IEC 14882-2003 §14.1: Vorlagenparameter
  • Siehe: ISO / IEC 14882-2003 §14.3.2: Template-Nicht-Typ-Argumente

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%     
Jesse Chisholm 10.02.2016, 01:38
quelle
13

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:

%Vor%

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.

    
James Kanze 03.08.2013 10:39
quelle
5

Sie können Zeichenfolgen mit C ++ 11 variadischen Vorlagen "simulieren":

%Vor%

Dies druckt:

  

Hallo Welt !!!

    
Manu343726 03.08.2013 12:30
quelle
5

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%

[Live-Demo]

    
W.F. 29.03.2016 01:17
quelle

Tags und Links