Variadic typedefs, oder "Bimaps hat den C ++ 0x Weg gemacht"

8

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.]

    
Kerrek SB 16.06.2011, 11:13
quelle

2 Antworten

9

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     
brunocodutra 16.06.2011, 15:48
quelle
0

Sie können ein Tupel definieren. Allerdings würde ich nicht wissen, wie ich dann die Typen wieder rausbekomme.

Am einfachsten wäre es, nur zwei vollständige Typen zu akzeptieren.

    
Puppy 16.06.2011 11:15
quelle

Tags und Links