#include <cassert>
#include <utility>

using std::declval;


/**** example starts here ****/

template <typename T, typename... Rest> struct sum_type {
    using type = decltype(
        declval<T>() + declval<typename sum_type<Rest...>::type>());
};
template <typename T> struct sum_type<T> { using type = T; };

template <typename T> T sum(const T &x) { return x; }
template <typename T, typename... Rest>
typename sum_type<T, Rest...>::type sum(const T &x, const Rest &... rest) {
    return x + sum(rest...);
}


int main() {
    assert(sum(3, 2, 4) == 9);
    assert(sum(1, 2, 4, 4.5) == 11.5);
}
