#include <utility>
template <typename...>
struct sum_impl;
/* This is the base case */
template <typename T1, typename T2>
struct sum_impl<T1, T2>
{
typedef decltype(std::declval<const T1&>() + std::declval<const T2&>()) result_type;
static result_type doit(const T1& v1, const T2& v2)
{
return v1 + v2;
}
};
/* And here is the recursive definition for left-associativity */
template <typename T1, typename T2, typename... Ts>
struct sum_impl<T1, T2, Ts...>
{
typedef decltype(std::declval<const T1&>() + std::declval<const T2&>()) step_type;
typedef typename sum_impl<step_type, Ts...>::result_type result_type;
static result_type doit(const T1& v1, const T2& v2, const Ts&... rest)
{
return sum_impl<step_type, Ts...>::doit(v1 + v2, rest...);
}
};
template <typename... Ts>
typename sum_impl<Ts...>::result_type sum(const Ts&... args)
{
return sum_impl<Ts...>::doit(args...);
}
#include <iostream>
int main(void)
{
std::cout << sum(1, 3, 5, 7, 9, 11) << std::endl;
std::cout << sum(1, 3.4, 5, 7, 9, 11) << std::endl;
}
I2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4+CnN0cnVjdCBzdW1faW1wbDsKCi8qIFRoaXMgaXMgdGhlIGJhc2UgY2FzZSAqLwp0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgpzdHJ1Y3Qgc3VtX2ltcGw8VDEsIFQyPgp7CiAgICB0eXBlZGVmIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxjb25zdCBUMSY+KCkgKyBzdGQ6OmRlY2x2YWw8Y29uc3QgVDImPigpKSByZXN1bHRfdHlwZTsKICAKICAgIHN0YXRpYyByZXN1bHRfdHlwZSBkb2l0KGNvbnN0IFQxJiB2MSwgY29uc3QgVDImIHYyKQogICAgewogICAgICAgIHJldHVybiB2MSArIHYyOwogICAgfQp9OwoKLyogQW5kIGhlcmUgaXMgdGhlIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIGZvciBsZWZ0LWFzc29jaWF0aXZpdHkgKi8KdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUuLi4gVHM+CnN0cnVjdCBzdW1faW1wbDxUMSwgVDIsIFRzLi4uPgp7CiAgICB0eXBlZGVmIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxjb25zdCBUMSY+KCkgKyBzdGQ6OmRlY2x2YWw8Y29uc3QgVDImPigpKSBzdGVwX3R5cGU7CiAgICB0eXBlZGVmIHR5cGVuYW1lIHN1bV9pbXBsPHN0ZXBfdHlwZSwgVHMuLi4+OjpyZXN1bHRfdHlwZSByZXN1bHRfdHlwZTsKCiAgICBzdGF0aWMgcmVzdWx0X3R5cGUgZG9pdChjb25zdCBUMSYgdjEsIGNvbnN0IFQyJiB2MiwgY29uc3QgVHMmLi4uIHJlc3QpCiAgICB7CiAgICAgICAgcmV0dXJuIHN1bV9pbXBsPHN0ZXBfdHlwZSwgVHMuLi4+Ojpkb2l0KHYxICsgdjIsIHJlc3QuLi4pOwogICAgfQp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgp0eXBlbmFtZSBzdW1faW1wbDxUcy4uLj46OnJlc3VsdF90eXBlIHN1bShjb25zdCBUcyYuLi4gYXJncykKewogICAgcmV0dXJuIHN1bV9pbXBsPFRzLi4uPjo6ZG9pdChhcmdzLi4uKTsKfQoKI2luY2x1ZGUgPGlvc3RyZWFtPgppbnQgbWFpbih2b2lkKQp7CiAgICBzdGQ6OmNvdXQgPDwgc3VtKDEsIDMsIDUsIDcsIDksIDExKSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgc3VtKDEsIDMuNCwgNSwgNywgOSwgMTEpIDw8IHN0ZDo6ZW5kbDsKfQo=