конечный тип возврата с использованием decltype с функцией шаблона 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;
}

В GCC 4.5.1 это, кажется, работает просто отлично для 2 аргументов, например сумма (2, 5,5) возвращается с 7,5. Однако с большим количеством аргументов, чем это, я получаю ошибки, что sum () просто еще не определена. Однако, если я объявлю sum () следующим образом:

template <class T, class P...>
T sum(const T& t, const P&... p);

Тогда это работает для любого количества аргументов, но sum (2, 5.5) вернет целое число 7, что я не ожидал. Имея более двух аргументов, я предполагаю, что decltype () должен был бы выполнить какую-то рекурсию, чтобы иметь возможность определить тип t + sum (p ...). Это законно C ++ 0x? или decltype () работает только с невариантными объявлениями? Если это так, как бы вы написали такую ​​функцию?

Ответы на вопрос(5)

Ваш ответ на вопрос