Ich habe die folgende Template-Klassenstruktur
%Vor%Die Host-Klasse kann jetzt wie folgt aussehen:
%Vor%Gibt es eine Möglichkeit, eine Typenliste mit boost :: mpl zu erstellen? Im Moment habe ich noch keine Idee, wo ich anfangen soll. Mein Ziel wäre eine Funktion wie diese:
%Vor%Ist das mit boost :: mpl möglich?
Ok, hier ist eine Implementierung. Es ist eher ad-hoc, man könnte es offensichtlich abstrahieren, um eine Abfolge von Lambda-Funktionen zu nehmen, aber ich habe es vorgezogen, diese gerade zu halten. Kommentare und Tests sind im Inneren:
%Vor%Die erwartete Ausgabe sollte lauten:
%Vor%Meine Antwort versucht, die bevorzugte für C ++ 11 Benutzer zu sein.
Joel Falcous Antwort ist großartig für den älteren Standard, aber C ++ 11's
Parameterpakete machen Boost-Typ-Sequenzen oft überflüssig. Außerdem finde ich Piggy Backing Templates in diesem Fall besser als boost::lambda
.
Tatsächlich verwendet meine Lösung keine Includes außer der kartesischen Produktvorlage, die ich aus hier übernehmen werde, da sie nicht im Standard enthalten ist Bibliothek.
Die Verwendung der aktuellsten Funktionen (ab C ++ 11) ermöglicht das Codieren einer Lösung, die:
expand_pack
führt seine Parameter aus. Dies ermöglicht es, Laufzeitcode mithilfe von Auslassungszeichen zu wiederholen. Beispiel: expand_pack(new T{}...)
. Jeder kennt den Namen dieses Idioms ?
wrap_template_as_type
piggy unterstützt eine Vorlage, damit sie dort verwendet werden kann, wo ein Typ erwartet wird. Vielleicht heißt dieses Idiom Template-Bindung oder Late-Template-Bindung .
Ich weiß es nicht, also habe ich diese Frage hier gepostet. Beispiele: wrap_template_as_type<map>
und das entgegengesetzte wrapper::unwrapp<int, string>
type_list
ein Tupel ohne Daten, Glocken und Wissel.
template_list
Eine Vorlage, die eine Liste von Vorlagen abruft und eine type_list mit den ursprünglichen Vorlagen, die in einem Wrapper gesichert sind, zurückgibt.
make_host_type
konvertiert A, B, C, D
in A<B<C<D>>>
all_hosts
erhält ein Tupel von Hosttypen und Nachrichten einen Host für jedes Element im Eingabetupel.
Beachten Sie, dass #include http://...
durch den verknüpften Inhalt ersetzt werden muss
Beachten Sie, dass MSVC PRETTY_FUNCTION nicht versteht, aber FUNCDNAME Ich denke
%Vor%Ausgabe ist: (Wenn Sie MSVC verwenden, ersetzen Sie PRETTY_FUNCTION durch etwas anderes)
%Vor%Tags und Links c++ boost metaprogramming boost-mpl