#include <iostream>
#include <cstdlib>
#include <valarray>
#include <numeric>
using namespace std;
template<typename ...Args> constexpr inline void non(Args ...) {}
template<typename T, typename ...Args>
inline T sum1(T val, Args ...args) { non(val += args ...); return val; } // v1
// why do we need some function non() here?
template<typename T, typename ...Args>
inline T sum2(T val, Args ...args) { auto tmp = { val += args... }; return val; } // v2
// why do we need some array tmp[] here?
template<typename T, typename ...Args>
inline T sum3(T val, Args ...args) { [](...){}((val += args)... ); return val; } // v3
// why do we need empty lambda [](...){} here?
template<typename T, typename ...Args>
inline T sum4(T val, Args ...args) { for (auto &i : { args... }) val += i; return val; } // v4
template<typename ...Args, typename T = common_type_t<Args...>>
inline T sum5(Args ...args) { return std::valarray<T>({ args... }).sum(); } // v5
template<typename T> constexpr inline T sum6(T val) { return val; }
template<typename T, typename ...Args>
constexpr inline T sum6(T val, Args ...args) { return val + sum6(args...); } // v6
int main() {
cout << sum1(1, 2, 3) << endl;
cout << sum2(1, 2, 3) << endl;
cout << sum3(1, 2, 3) << endl;
cout << sum4(1, 2, 3) << endl;
cout << sum5(1, 2, 3) << endl;
cout << sum6(1, 2, 3) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPHZhbGFycmF5PgojaW5jbHVkZSA8bnVtZXJpYz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+IGNvbnN0ZXhwciBpbmxpbmUgdm9pZCBub24oQXJncyAuLi4pIHt9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgppbmxpbmUgVCBzdW0xKFQgdmFsLCBBcmdzIC4uLmFyZ3MpIHsgbm9uKHZhbCArPSBhcmdzIC4uLik7IHJldHVybiB2YWw7IH0gICAvLyB2MQovLyB3aHkgZG8gd2UgbmVlZCBzb21lIGZ1bmN0aW9uIG5vbigpIGhlcmU/Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgppbmxpbmUgVCBzdW0yKFQgdmFsLCBBcmdzIC4uLmFyZ3MpIHsgYXV0byB0bXAgPSB7IHZhbCArPSBhcmdzLi4uIH07IHJldHVybiB2YWw7IH0gICAvLyB2MgovLyB3aHkgZG8gd2UgbmVlZCBzb21lIGFycmF5IHRtcFtdIGhlcmU/Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi5BcmdzPgppbmxpbmUgVCBzdW0zKFQgdmFsLCBBcmdzIC4uLmFyZ3MpIHsgW10oLi4uKXt9KCh2YWwgKz0gYXJncykuLi4gKTsgcmV0dXJuIHZhbDsgfSAgIC8vIHYzCi8vIHdoeSBkbyB3ZSBuZWVkIGVtcHR5IGxhbWJkYSBbXSguLi4pe30gaGVyZT8KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CmlubGluZSBUIHN1bTQoVCB2YWwsIEFyZ3MgLi4uYXJncykgeyBmb3IgKGF1dG8gJmkgOiB7IGFyZ3MuLi4gfSkgdmFsICs9IGk7IHJldHVybiB2YWw7IH0gICAvLyB2NAoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVCA9IGNvbW1vbl90eXBlX3Q8QXJncy4uLj4+CmlubGluZSBUIHN1bTUoQXJncyAuLi5hcmdzKSB7IHJldHVybiBzdGQ6OnZhbGFycmF5PFQ+KHsgYXJncy4uLiB9KS5zdW0oKTsgfSAgIC8vIHY1CgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3RleHByIGlubGluZSBUIHN1bTYoVCB2YWwpIHsgcmV0dXJuIHZhbDsgfQoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KY29uc3RleHByIGlubGluZSBUIHN1bTYoVCB2YWwsIEFyZ3MgLi4uYXJncykgeyByZXR1cm4gdmFsICsgc3VtNihhcmdzLi4uKTsgfSAgLy8gdjYKCgppbnQgbWFpbigpIHsKCiAgICBjb3V0IDw8IHN1bTEoMSwgMiwgMykgPDwgZW5kbDsKICAgIGNvdXQgPDwgc3VtMigxLCAyLCAzKSA8PCBlbmRsOwogICAgY291dCA8PCBzdW0zKDEsIDIsIDMpIDw8IGVuZGw7CiAgICBjb3V0IDw8IHN1bTQoMSwgMiwgMykgPDwgZW5kbDsKICAgIGNvdXQgPDwgc3VtNSgxLCAyLCAzKSA8PCBlbmRsOwogICAgY291dCA8PCBzdW02KDEsIDIsIDMpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=