un parámetro de plantilla se puede utilizar en otro parámetro de plantilla que sigue de esta manera:Cómo utilizar un parámetro de plantilla en otro parámetro de plantilla declarado ante
template<typename T, T N>
struct s
{
};
Pero es posible hacer referencia a "T" si se trata de declarado después de "N"?
Esto no funciona:
template<T N, typename T>
struct s
{
};
Podemos ayudar al compilador mediante pre-declarando "T" o hacer cualquier otra cosa?
Gracias por adelantado.
EDITAR: como las dos primeras respuestas preguntaban "¿por qué estás dispuesto a hacer eso?" Explicaré el objetivo:
Me gustaría hacer que el compilador infiera el tipo "T" para facilitar el uso de clases con plantilla.
Por ejemplo:
template<typename T, T A, T B>
struct sum
{
static T const value = A + B;
};
Esta plantilla se puede utilizar de esta manera:
sum<int, 1, 2>::value
Pero sería mejor si pudiera ser utilizado de esta manera:
sum<1, 2>::value
Técnicamente debe ser posible porque el compilador conoce los tipos de "1" y "2": "int", y de hecho usa estos inf ormaciones para encontrar la mejor sobrecarga para una función. Así declarando la plantilla de esta manera:
template<T A, T B, typename T>
struct sum
{
static T const value = A + B;
};
el compilador podría utilizar su capacidad de inferir el último parámetro de las informaciones proporcionadas por el primer y el segundo, y luego encontrar la mejor plantilla para crear una instancia.
Gracias por la respuesta: si la norma dice no, es no. La pregunta ahora es: ¿por qué este comportamiento limitado mientras que parece posible hacer esta deducción? ¿Tiene algunos ejemplos que justifiquen esta decisión? Gracias. – Pragmateek
¿Porque la metaprogramación de plantillas nunca fue pensada para ser expresiva? :) Interesante pregunta, sin embargo. Puede ser que deba verificar si esto ha sido propuesto, o hacer esa proposición para C++ 1x. – UncleBens