#include <iostream>
#include <string>
#include <type_traits>
#include <utility>
using namespace std;
template <typename T> T sum(T && x)
{
return std::forward<T>(x);
}
template <typename T, typename ...Args>
typename std::common_type<T, Args...>::type sum(T && x, Args &&... args)
{
return std::forward<T>(x) + sum(std::forward<Args>(args)...);
}
int main()
{
auto y = sum(1, 2, 4.5); // OK
cout << y << endl;
auto x = sum(std::string("Hello!"), "World"); // OK
cout << x << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHN1bShUICYmIHgpCnsKICAgIHJldHVybiBzdGQ6OmZvcndhcmQ8VD4oeCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgp0eXBlbmFtZSBzdGQ6OmNvbW1vbl90eXBlPFQsIEFyZ3MuLi4+Ojp0eXBlIHN1bShUICYmIHgsIEFyZ3MgJiYuLi4gYXJncykKewogICAgcmV0dXJuIHN0ZDo6Zm9yd2FyZDxUPih4KSArIHN1bShzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwp9CgppbnQgbWFpbigpCnsKICAgIGF1dG8geSA9IHN1bSgxLCAyLCA0LjUpOyAvLyBPSwogICAgY291dCA8PCB5IDw8IGVuZGw7CgogICAgYXV0byB4ID0gc3VtKHN0ZDo6c3RyaW5nKCJIZWxsbyEiKSwgIldvcmxkIik7IC8vIE9LCiAgICBjb3V0IDw8IHggPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==