2014-10-09 2 views
17

Supponiamo di avere una classefunzioni come argomenti di modelli variadic

template <int(*F)(int, int)> 
class A { 
    // ... 
}; 

Ci vuole una funzione come argomento di modello.

Ora voglio creare un modello variadico che funzioni come parametri del modello.

template <int(*F...)(int, int)> // this won't compile 
template <int(*F)(int, int)...> // this won't compile either 

Come fare correttamente?

+1

Quindi, quali errori di compilazione hai ottenuto? – Useless

+2

I puntini di sospensione sono sempre "poco prima" del nome, in questo caso "F". – leemes

risposta

12
template <int(*...F)(int, int)> 
class A { 
    // ... 
}; 
18

Si può fare

using Function_t = int(*)(int, int); 

template <Function_t ... Fs> struct s{}; 

altro, se non si desidera utilizzare typedef

template <int(*...Fs)(int, int)> struct s{}; 

Nota: la seconda versione non può essere anonimo (Fs è richiesto) come ISO C++ 11 richiede una dichiarazione di pacco tra parentesi per avere un nome.

3

Basta usare F come argomento modello. Questo non solo consente di utilizzare la funzione come parametro ma anche altri tipi che implementano l'operatore della parentesi. Queste classi sono chiamate funzioni.

+4

Potrebbe essere un suggerimento saggio ma non una soluzione al problema. Si noti inoltre che qui le funzioni stesse sono i parametri del modello, non solo il loro tipo. Nel tuo caso, i tipi di functor sarebbero i parametri del template, ma (a seconda di dove sono usati) devi passarli come argomenti di funzione. – leemes

2

La sintassi del tipo di puntatore a funzione è fastidiosa. Quindi codice intorno:

template<class T> using type=T; 

template< type<int(int,int)>* ... Fs > 
class A { 
}; 
+0

Anche se interessante, l'uso di sintassi diverse per quelle funzioni di tipo sembra strano IMHO. Forse 'pointer '? – dyp

+0

@dyp Voglio che le cose vengano lette da sinistra a destra come le variabili "normali", e 'pointer ' non lo fa. – Yakk

+0

Bene si potrebbe iniziare a dichiarare variabili normali come questa: 'puntatore x; array f; riferimento >>> s; ';) - hmm named type operators? – dyp