Metaprogrammierung
-
Boost Spirit ist meta-programmiert. Du gibst in Source Code eine EBNF-ähnliche Form ein und daraus wird ein Parser zur Compilerzeit gebaut.
-
Ein sehr schoenes Beispiel ist z.B. Typsicherheit bei physikalischen Berechnungen wie sie in Boost's MPL angegeben ist. D.h. wenn ich eine Kraft mit einem Weg vergleiche, dann soll schon der Compiler den Fehler feststellen.
Boost's Spirit halte ich dagegen nicht so toll. Es gibt Parser wie Sand am mehr, die sich ebenfalls gut in C oder C++ einbinden lassen.
-
umsteller schrieb:
Ich erweitere mal die Frage auf:
In welchen Situationen habt ihr schon Metaprogrammierung verwendet?
Für enum-Typ mapping. In einem Programm hatte ich ein kleines Protokoll mit Befehlen, die durch ein Enum codiert waren. Je nach Befehl wurden zusätzliche Daten benötigt, die völlig unterschiedliche Typen haben konnten. Das Ganze ging dann in etwa so:
enum ECommand { /* ... */ }; struct Command { ECommand ec; virtual ~Command() {} }; struct Empty_t {}; template <ECommand EC> struct Ec2Type { typedef Empty_t type; }; //partial specalizations of Ec2Type... template <ECommand EC> struct ParametrizedCommand : public Command { typename Ec2Type<EC>::type param; };Die ParametrizedCommand's wurden dann per shared_ptr<Command> durch die Gegend gereicht, es gab dazu noch eine create- und eine extract-Funktion, die die Commands mit Parametern erstellt haben bzw. die Parameterwerte daraus extrahiert haben.
Vermutlich wäre es auch einfacher gegangen, aber ich spiele halt gerne mit TMP rum
knivil schrieb:
Boost's Spirit halte ich dagegen nicht so toll. Es gibt Parser wie Sand am mehr, die sich ebenfalls gut in C oder C++ einbinden lassen.
Und selbst wenns noch Meer Parser gäbe, wäre das kein Argument dass Spirit schlecht ist
Ich weiß nicht wie gut sich Spirit in produktivem COde einsetzen lässt, aber schon das Konzept ist eines der besten Beispiele wie viel erstaunliche Dinge man erreichen kann wenn man die verschiedenen Paradigmen von C++ richtig kombiniert.