#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);
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgc3RkOjpkZWNsdmFsOwoKCi8qKioqIGV4YW1wbGUgc3RhcnRzIGhlcmUgKioqKi8KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBSZXN0PiBzdHJ1Y3Qgc3VtX3R5cGUgewogICAgdXNpbmcgdHlwZSA9IGRlY2x0eXBlKAogICAgICAgIGRlY2x2YWw8VD4oKSArIGRlY2x2YWw8dHlwZW5hbWUgc3VtX3R5cGU8UmVzdC4uLj46OnR5cGU+KCkpOwp9Owp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IHN1bV90eXBlPFQ+IHsgdXNpbmcgdHlwZSA9IFQ7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBzdW0oY29uc3QgVCAmeCkgeyByZXR1cm4geDsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gUmVzdD4KdHlwZW5hbWUgc3VtX3R5cGU8VCwgUmVzdC4uLj46OnR5cGUgc3VtKGNvbnN0IFQgJngsIGNvbnN0IFJlc3QgJi4uLiByZXN0KSB7CiAgICByZXR1cm4geCArIHN1bShyZXN0Li4uKTsKfQoKCmludCBtYWluKCkgewogICAgYXNzZXJ0KHN1bSgzLCAyLCA0KSA9PSA5KTsKICAgIGFzc2VydChzdW0oMSwgMiwgNCwgNC41KSA9PSAxMS41KTsKfQo=