2012-08-10 20 views
12

Estoy un poco confundido porque tanto una plantilla de parámetro predeterminada como un parámetro de plantilla variadic tienen que ser el último parámetro de una plantilla. Entonces, ¿cuál es la buena sintaxis oficial para mi función?Plantilla de parámetro predeterminada frente a plantilla variadic: ¿cuál es el último parámetro de plantilla?

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

o

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

Respuesta

17

En realidad, paquetes de parámetros de plantilla y los parámetros por defecto no tienen a ser el último en una función, si todo lo que viene después de que se deduce (o sea descalificado):

template<class T, class... Args, class T2 = int, class T3> 
void f(T3){} 

Tenga en cuenta que nunca se puede especificar nada para T2, ya que todo será tragada por el paquete de variadic . Para concluir, diría que tiene sentido colocar paquetes variados después de los parámetros predeterminados, si se deben especificar manualmente. Para los paquetes deducidos, es una opción más estilística, y yo personalmente los pondría al final.

Tenga en cuenta que si se les deducen como parte de otra plantilla, que incluso puede tener múltiples paquetes variadic:

template<class...> struct pack{}; 

template<class T, class... P1, class... P2, class T2> 
void f(pack<P1...>, pack<P2...>, T2){} 

En casos como este, me gustaría poner los paquetes y otros parámetros de plantilla en relación con su parámetros de función, es decir, en el mismo orden.

Para las plantillas de clase (primaria), esto es diferente, por supuesto, ya que no puede haber argumentos deducidos. De hecho, los paquetes tienen variadic a estar al final de la lista de parámetros de plantilla:

template<class T, class... Args, class T2=int> 
struct X{}; // error 

Para especializaciones parciales, el orden no es importante y es una elección puramente estilística de nuevo. Personalmente los pondría en relación con los parámetros de la plantilla primaria, como antes.

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...>>{}; 
Cuestiones relacionadas