2012-08-10 13 views
12

Sono un po 'confuso perché sia ​​un modello di parametro predefinito che un parametro modello variadico devono essere l'ultimo parametro di un modello. Quindi qual'è la buona sintassi ufficiale per la mia funzione?Modello parametro predefinito vs modello variadic: qual è l'ultimo parametro del modello?

template<typename T, class T2 = double, unsigned int... TDIM> myFunction(/* SOMETHING */) 

o

template<typename T, unsigned int... TDIM, class T2 = double> myFunction(/* SOMETHING */) 

risposta

17

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...>>{}; 
Problemi correlati