2012-10-01 20 views
5

Eventuali duplicati:
using declaration in variadic templateespansione variadic di dichiarazione using

Recentemente ho incontrato a generic mechanism per combinare due oggetti funzione per formare un nuovo oggetto funzione che si comporta come se le prime due sono stati sovraccaricati:

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(); 
}; 

Sto cercando di estendere questa idea t o di lavoro per oggetti funzione N, utilizzando i modelli variadic:

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

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

Tuttavia, GCC lamenta il mio tentativo di fare l'espansione variadic sulla dichiarazione using:

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();... 
         ^

Ho provato alcune varianti, come ad come:

using Fs::operator()...; 

e

using Fs...::operator(); 

ma nemmeno il trucco.

È possibile farlo?

+1

Si noti che un tipo di classe con un operatore di conversione ad es. il tipo di puntatore a funzione (una cosiddetta funzione di chiamata surrogata) è un tipo di funtore e tuttavia non è compatibile con tale meccanismo. Non importa troppo perché sono esotici, ma è un po 'frustrante non essere del tutto generico (TTBOMK). –

+1

[Questo] (http://stackoverflow.com/questions/7870498/using-declaration-in-variadic-template) potrebbe essere utile (se non per una risposta, almeno per quanto viene tentato). –

+0

@Luc: non è un duplicato diretto? Votato per chiudersi come uno. – Xeo

risposta

0

Invece di “ Recentemente ho sono imbattuto in un meccanismo generico ”, si prega di fornire i riferimenti come “ Recentemente ho trovato un blog posting by Dave Abrahams che descrive un meccanismo generico ” & hellip ;.

dubito che l'espansione di parametro pacchetto è supportato per using affermazione, e mi ’ dispiace I don ’ t hanno il tempo di controllare lo standard – che ’ s nuovo tua lavoro, al leggere la documentazione prima di chiedere la domanda.

Tuttavia, per risolvere il problema in questione (piuttosto che la questione della lingua), è sempre possibile codificarlo ricorsivamente anziché utilizzare l'espansione diretta. Solo ereditare da una classe che porta nel resto dei funtori, quindi inserire il primo. Dove “ il resto ” è il passo ricorsivo, che termina in una lista vuota di funtori come caso base.

+0

Intendevo aggiungere un link a dove ho visto il meccanismo in questione, ma non ho trovato l'articolo o non ricordo il suo nome nel momento in cui ho scritto la domanda. Grazie per averlo scavato! – HighCommander4

+0

La soluzione ricorsiva è una buona idea. In effetti, l'articolo a cui ti sei collegato ha un link in una nota a piè di pagina (https://gist.github.com/3779345) a tale soluzione. – HighCommander4

+0

@ HighCommander4: heh, non lo sapevo. –