Kurze Frage: Kann ich ein variadisches Argument-Pack eingeben? Ich brauche template <typename ...T> struct Forward { typedef T... args; };
.
Lange Version:
Ich habe überlegt, die ausgezeichnete Boost-Bimap in C ++ 0x. Beachten Sie, dass ein Bimap der beiden Typen S
und T
ein std::set
der Relationen zwischen S x
und T y
ist. Die Objekte selbst sind in zwei unabhängigen internen Containern gespeichert, und die Relationen verfolgen die zugehörigen Iteratoren, die ich vermute; beide Typen können über "links" und "rechts" als Schlüssel dienen. Abhängig von der Wahl der internen Behälter können die Werte einzigartig sein oder nicht, z. Wenn der linke Container ein Satz ist und der rechte Container ein Multiset, dann kann ein x
auf viele verschiedene y
s abgebildet werden, und ein richtiger Lookup ergibt einen gleichen Bereich. Beliebte interne Container sind set
, multiset
, vector
und list
und vielleicht auch die unordered_*
Versionen.
Wir brauchen also einen Typ, der zwei Container als Template-Parameter akzeptiert:
%Vor%Aber wir müssen akzeptieren, dass die Container beliebig viele Argumente haben können, also müssen wir all diese auch übergeben. Wenn wir nur einen Satz variadischer Argumente benötigen, wäre das kein Problem, da wir diese direkt übergeben könnten. Aber jetzt brauchen wir zwei Sätze von Argumenten, also möchte ich einen Forwarder schreiben, der so verwendet wird:
%Vor%Hier ist die Vorlage, die ich mir ausgedacht habe:
%Vor% Leider kann ich in der angegebenen Zeile in Forward
nicht herausfinden, wie man das Parameterpaket eingibt! (Die kommentierte Zeile gibt einen Compilerfehler an.)
[Ich nehme an, ich könnte für eine faule Version Bimap<std::set<int, MyPred>, std::multiset<char, YourPred>> x;
wählen und die Typen über LeftCont::value_type
und RightCont::value_type
extrahieren, aber ich dachte, es wäre schöner, wenn ich die Schlüsseltypen zu meinen primären Vorlagenargumenten machen und zulassen könnte standardmäßig auf std::set
containers.]
Sie können erreichen, was Sie wollen, indem Sie das Variadic-Argument-Pack in ein Tupel einkapseln und später die folgenden zwei Hilfs-Template-Strukturen verwenden, um die eigentlichen Variadic-Argumente weiterzuleiten:
%Vor%und
%Vor%würde Ihr Codebeispiel so aussehen:
%Vor%was unter gcc 4.6.0
gut funktioniert