Quiero escribir un sumador simple (para risas) que suma cada argumento y devuelve una suma con el tipo apropiado. Actualmente, tengo esto:tipo de retorno final usando decltype con una función de plantilla variadic
#include <iostream>
using namespace std;
template <class T>
T sum(const T& in)
{
return in;
}
template <class T, class... P>
auto sum(const T& t, const P&... p) -> decltype(t + sum(p...))
{
return t + sum(p...);
}
int main()
{
cout << sum(5, 10.0, 22.2) << endl;
}
En GCC 4.5.1 esto parece funcionar muy bien para 2 argumentos, por ejemplo, sum (2, 5.5) regresa con 7.5. Sin embargo, con más argumentos que esto, recibo errores de que sum() simplemente no está definido aún. Si Declaro suma() al igual que esto, sin embargo:
template <class T, class P...>
T sum(const T& t, const P&... p);
entonces funciona para cualquier número de argumentos, pero suma (2, 5.5) devolvería entero 7, que no es lo que se puede esperar. Con más de dos argumentos supongo que decltype() tendría que hacer algún tipo de recursión para poder deducir el tipo de t + suma (p ...). ¿Es esto legal C++ 0x? o ¿decltype() solo funciona con declaraciones no variadicas? Si ese es el caso, ¿cómo escribirías esa función?
Esta es una interesante problema. Tal vez deberías preguntar en el grupo de Usenet comp.std.C++ si se supone que este tipo de "llamada recursiva" en '-> decltype (expr)' funciona o no. – sellibitze
No se supone que funcione con la redacción actual. El punto de declaración de funciones/variables, etc. es después de su declarador. Por lo tanto, 'sum' en el tipo de devolución especificado más tarde no puede encontrar la plantilla' sum' que se está definiendo. –
@Johannes: ¿Pero la búsqueda no se ha retrasado (hasta la segunda fase) debido a la dependencia de la expresión en los parámetros de la plantilla? – sellibitze