#include <type_traits>
#include <utility>
#include <iostream>

template<typename T>
T sum(T a) { return a; }

template<typename T, typename T1>
typename std::common_type<T, T1>::type sum(T a, T1 b) { return a + b; };

template<typename T, typename ...Args>
typename std::common_type<T, Args...>::type sum(T a, Args ...args) {
    return sum(a, sum(args...));
};

int main() {
    std::cout << sum(1, 2, 3) << std::endl;
    std::cout << sum(1) << std::endl;
    std::cout << sum(2, 5, 6, 8, 8, 9, 2.2f) << std::endl;
}