2012-10-01 9 views
5

Mögliche Duplizieren:
using declaration in variadic templateVariadische Erweiterung der Verwendung Deklaration

ich über a generic mechanism für die Kombination von zwei Funktionsobjekte kam vor kurzem eine neue Funktion Objekt zu bilden, als ob die ersten beiden verhält wurden überlastet:

template <typename F1, typename F2> 
struct overload : public F1, public F2 
{ 
    overload(F1 f1, F2 f2) : F1(f1), F2(f2) {} 

    using F1::operator(); 
    using F2::operator(); 
}; 

Ich versuche, diese Idee t zu erweitern o Arbeit für N Funktionsobjekte, mit variadische Vorlagen:

template <typename... Fs> 
struct overload : public Fs... 
{ 
    overload(Fs... fs) : Fs(fs)... {} 

    using Fs::operator();... 
}; 

Allerdings klagt GCC über meinen Versuch variadische Expansion auf der using-Deklaration zu tun:

test.cpp:6:24: error: parameter packs not expanded with '...': 
    using Fs::operator();... 
         ^
test.cpp:6:24: note:   'Fs' 
test.cpp:6:26: error: expected unqualified-id before '...' token 
    using Fs::operator();... 
         ^

ich einige Varianten ausprobiert habe, so wie:

using Fs::operator()...; 

und

using Fs...::operator(); 

aber auch nicht den Trick.

Ist es möglich, dies zu tun?

+1

Beachten Sie, dass ein Klassentyp mit einem Konvertierungsoperator z. Der Funktions-Zeigertyp (eine sogenannte Ersatz-Aufruf-Funktion) ist ein Funktortyp und ist dennoch nicht mit einem solchen Mechanismus kompatibel. Es ist nicht so wichtig, weil diese exotisch sind, aber es ist ein bisschen frustrierend, nicht völlig generisch zu sein (TTBOMK). –

+1

[This] (http://stackoverflow.com/questions/7870498/using-declaration-in-variadic-template) kann hilfreich sein (wenn nicht für eine Antwort, zumindest für das, was versucht wird). –

+0

@Luc: Ist das nicht ein direktes Duplikat? Gewählt, um als eins zu schließen. – Xeo

Antwort

0

Statt “ ich kam vor kurzem in einem allgemeinen Mechanismus ”, bitte Referenzen bieten wie “ ich auf ein blog posting by Dave Abrahams kam vor kurzem einen allgemeinen Mechanismus ” & hellip beschreiben ;.

Ich bezweifle, dass Parameter Expansion Pack für using Anweisung unterstützt wird, und ich ’ bin traurig, dass ich ’ don t die Zeit haben, die Standard-– dass ’ s wieder Ihre Aufgabe, zu prüfen, zu die Dokumentation zu lesen bevor er fragte: die Frage.

Aber als praktische Lösung des Problems (statt der Sprachfrage) können Sie das immer rekursiv programmieren, anstatt die direkte Erweiterung zu verwenden. Erben Sie einfach von einer Klasse, die den Rest der Funktoren einbringt, und bringen Sie dann die erste ein. Wobei “ der Rest ” der rekursive Schritt ist, der bei einer leeren Liste von Funktoren als Grundfall endet.

+0

Ich wollte einen Link dorthin hinzufügen, wo ich den fraglichen Mechanismus gesehen habe, aber ich konnte den Artikel nicht finden oder seinen Namen zu dem Zeitpunkt zurückrufen, als ich die Frage schrieb. Danke für das Ausgraben! – HighCommander4

+0

Die rekursive Lösung ist eine nette Idee. In der Tat hat der Artikel, den Sie verlinkt haben, einen Link in einer Fußnote (https://gist.github.com/3779345) zu einer solchen Lösung. – HighCommander4

+0

@ HighCommander4: heh, ich wusste es nicht. –

Verwandte Themen