C++ string-template-Bibliothek
Ich will einfach C++ string-basierte template-library zu ersetzen-strings zur Laufzeit.
Zum Beispiel, ich werde
string template = "My name is {{name}}";
Zur Laufzeit, ich will, dass die Namen geändert werden, auf der Grundlage der tatsächlichen ein.
Fand ich ein Beispiel, www.stringtemplate.org aber ich habe etwas Angst, wenn seine Gespräche über antlr etc.
- Die 'Vorlagen' - tag nicht angemessen ist, hier. Ersetzen von Zeichenfolgen innerhalb einer template-string ist nicht das gleiche wie die übliche Bedeutung von Vorlagen in einem C++ - Kontext.
- Durch die 'tatsächlichen', Sie bedeuten, dass eine variable mit dem Namen 'name' definiert, der im Rahmen der string-template?
- Was ist die Frage?
- Es ist immer noch templating, technisch. Aber sowas wie string-Formatierung besser funktionieren würde.
template
ist kein Gültiger Bezeichner ist, es ist ein Schlüsselwort. In jedem Fall, was ist "aktuell"? Können Sie uns ein Beispiel für deine Absichten?- Wagt man Fragen, wo der 'name' in {{name}} ist kommen soll?
- warum spielt es eine Rolle wo die Ersatz-Saiten her? Die OP kann eine Funktion schreiben, die nimmt
map
, so füllen die Karte einen Unterschied Besorgnis ...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Update: Das Projekt ist umgezogen zu Github und umbenannt in CTemplate: https://github.com/OlafvdSpek/ctemplate
Aus der neuen Projekt-Seite:
Haben Sie versucht, Google CTemplate Bibliothek ? Es scheint zu sein, genau das, was Sie suchen: http://code.google.com/p/google-ctemplate/
Dein Beispiel umgesetzt würde wie diese:
Im Beispiel.tpl:
In example.cc:
Dann:
Beachten Sie, dass es auch eine Art zu schreiben Vorlagen als const-strings, wenn Sie nicht die Mühe machen möchten, schreiben Sie Ihre Vorlagen in separaten Dateien.
Können Sie
sprintf
?Gibt es auch
boost::format
wenn Sie wollen gehören zu steigern.sprintf
. Aber das ist, was ich verwenden, also +1 🙂snprintf
, um Pufferüberläufe zu vermeiden. Siehe libslack.org/manpages/snprintf.3.htmlsnprintf
ist nicht standard-C++. Ist es standard, C99, aber, und das ist eine Erweiterung, wahrscheinlich alle großen standard-Bibliothek Implementierungen für C++, die auch mit C99.{{name}}
; es gibt nur%s
.Wenn Sie eine Funktion ersetzt alle vorkommen einer Zeichenfolge durch eine andere Zeichenfolge:
Dann können Sie dies tun:
Homer
Sie setzen{{last_name}}
als Wert{{first_name}}
Sie bekommen nicht das gewünschte Ergebnis...Wenn Sie ein neues C++, hinzufügen von neuen Bibliotheken (Vorlage oder anderweitig) zu Ihrer installation wird nur erhöhen die Lernkurve. Dies ist etwas, das Sie tun können, einfach, elegant und effizient mit der integrierten Funktionen.
Im Gegensatz zu ähnlichen Antworten, dieser code macht nur einen Durchlauf über die Eingabe und skaliert gut mit großen Wörterbücher:
Haben Sie als eine Reihe von inline-Funktionen, verwenden ostringstram anstelle von "string templates"?
Gibt es Alternative Ansätze, wenn Sie brauchen mehr gemeinsamkeit. Zum Beispiel einer Klassenhierarchie, wo die Basis bietet eine "format" - Schnittstelle und Kind-Klassen implementieren es mit den geeigneten unterschiedlicher Umsetzung.
Können Sie einen Blick auf Inja. Es ist eine einfache, header-nur die template-engine und tut, was Sie für Fragen. Dort kann man nur anrufen
Könnte es zu viel des guten, aber Sie können auch nehmen einen Blick auf boost::spirit, und genauer gesagt, das 'karma', die einen text-generator.
Wenn Sie viele Platzhalter, e.g wenn Sie eine makro-Vorlage für einen Brief, den Sie möchten, werden automatisch erweitert, einige grundlegende tokenization wäre einfacher zu verwalten, implementieren und erweitern Sie später. E. g
Jedoch, wenn das problem einfach genug, und die Vorlage ist klein genug, nur für eine der Antworten erwähnt.