In realtà, i pacchetti dei parametri del modello e dei parametri di default non hanno di essere l'ultimo in una funzione, se tutto ciò che viene dopo sarà dedotta (o è in default):
template<class T, class... Args, class T2 = int, class T3>
void f(T3){}
Nota che non si può mai specificare niente per T2
, dal momento che tutto sarà inghiottito dal pacco variadic . Concludendo da ciò, direi che ha senso mettere i pacchetti variadici dopo i parametri di default, se devono essere specificati manualmente. Per i pacchetti dedotti, è più una scelta stilistica, e personalmente li metterei per ultimi.
Si noti che se sono dedotte come parte di un altro modello, si può anche avere più confezioni variadic:
template<class...> struct pack{};
template<class T, class... P1, class... P2, class T2>
void f(pack<P1...>, pack<P2...>, T2){}
In casi come questo, mi piacerebbe mettere il pack e altri parametri di modello relativi alla loro parametri di funzione, cioè nello stesso ordine.
Per i modelli di classe (primaria), questo è diverso naturalmente, poiché non vi possono essere argomenti dedotti. In realtà, confezioni variadic hanno di essere alla fine della lista dei parametri del modello:
template<class T, class... Args, class T2=int>
struct X{}; // error
Per specializzazioni parziali, l'ordine non importa, ed è ancora una volta una scelta puramente stilistica. Personalmente li avrei messi relativamente ai parametri del template primario, come prima.
template<class T1, class T2>
struct X{};
template<template<class...> class T1, class... A1,
template<class...> class T2, class... A2>
struct X<T1<A1...>, T2<A2...>>{};