Я хочу написать простой сумматор (для хихиканья), который добавляет каждый аргумент и возвращает сумму с соответствующим типом. В настоящее время у меня есть это:
#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...). Является ли это законным С++ 0x? или decltype() работает только с невариантными объявлениями? Если это так, как бы вы пишете такую функцию?