Erstellen aller Template-Permutationen mit MPL

8

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?

    
mkaes 06.05.2011, 08:47
quelle

2 Antworten

5

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%     
Joel Falcou 07.05.2011, 16:03
quelle
3

Einführung

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:

  1. Waage besser.
  2. ist kürzer
  3. Ist besser lesbar, weil die Lösung die Bedenken trennt.

Die verschiedenen Vorlagen erklärt:

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.

Vollständiges Beispiel

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%     
Patrick Fromberg 12.11.2013 06:56
quelle