La domanda quasi non ha senso senza un esempio. Quindi ecco cosa sto cercando di fare.Perché utilizzare un parametro del parametro di valore integrale non consentito dopo un pacchetto di parametri di tipo in C++ 11?
In generale, C++ permette la seguente:
template<class T, class U, T t, U u>
void func() {}
func<char, int, 'A', 10>();
ma sembra che la sua estensione variadic naturale non funziona.
template<class...T, T... t>
void func() {}
func<char, int, 'A', 10>();
Sia clang che g ++ 4.7 rifiutano il codice precedente. L'errore viene mostrato dove viene eseguita l'istanziazione. Mi sembra che le due liste variadiche debbano essere analizzate senza ambiguità perché la prima ha tipi e l'altra ha solo valori interi.
Se quanto sopra non è pensato per funzionare, penso che quanto segue non funzionerà neanche.
template <class Ret, class... Args, Ret (*func)(Args...)>
class Foo {};
Penso che il modello Foo sia una cosa piuttosto utile da avere.
Il modello 'Foo' sarebbe come dire' template ', l'ultimo parametro template in realtà non aggiunge nulla ed è quindi completamente unnessecary, dopotutto il tipo può essere espresso bene usando il parametri del template (ad esempio 'typedef Ret (* func) (Args ...)' all'interno di 'Foo') –
Grizzly
@Grizzly: l'ultimo parametro non fornisce un * tipo * (che potrebbe essere sostituito da typedef), sta fornendo un puntatore di funzione. Un puntatore a funzione che viene sostituito in fase di compilazione, consentendo in tal modo l'ottimizzazione procedurale incrociata come l'inlining. –
@Sumant: hai ragione che sembra non ambiguo, tuttavia penso che lo Standard abbia semplicemente puntato alla semplicità specificando che un pacchetto di parametri era l'ultimo "parametro" possibile e che nulla poteva venire dopo. Questo rende più facile la corrispondenza. –