Je veux écrire un simple additionneur (pour rire) qui ajoute chaque argument et retourne une somme avec le type approprié. Actuellement, j'ai obtenu ceci:
#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;
}
Sur GCC 4.5.1 cela semble fonctionner très bien pour 2 arguments par exemple, somme(2, 5.5) renvoie à l'article 7.5. Cependant, avec plus d'arguments que ça, j'ai des erreurs que sum() n'est tout simplement pas encore définie. Si je déclare somme() comme ceci cependant:
template <class T, class P...>
T sum(const T& t, const P&... p);
Puis il travaille pour un nombre quelconque d'arguments, mais de la somme(2, 5.5) serait de retour entier 7, ce qui n'est pas ce que je m'attends. Avec plus de deux arguments, je suppose que decltype() serait de faire une sorte de récursivité pour être en mesure de déduire le type de t + sum(p,...). Est-ce légal de C++0x? ou ne decltype() uniquement avec les variadic déclarations? Si c'est le cas, comment voulez-vous écrire une telle fonction?