#include <iostream>
using namespace std;
template<typename... T>
int add(T... ints)
{
int result = 0;
using expand_variadic_pack = int[]; // dirty trick, see below
(void)expand_variadic_pack{0, ((result += ints), void(), 0)... };
// first void: silence variable unused warning
// uses braced-init-list initialization rules, which evaluates
// the elements inside a braced-init-list IN ORDER, to repetetively
// execute a certain operation
// second void is to prevent malicious "operator," overloads, which
// cannot exist for void types
// 0 at the end is to handle empty variadic pack (zero-size array initializer is illegal.
return result;
}
int main()
{
std::cout << add(1,2,3,4) << '\n';
std::cout << add() << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gVD4KaW50IGFkZChULi4uIGludHMpCnsKICBpbnQgcmVzdWx0ID0gMDsKICB1c2luZyBleHBhbmRfdmFyaWFkaWNfcGFjayAgPSBpbnRbXTsgLy8gZGlydHkgdHJpY2ssIHNlZSBiZWxvdwogICh2b2lkKWV4cGFuZF92YXJpYWRpY19wYWNrezAsICgocmVzdWx0ICs9IGludHMpLCB2b2lkKCksIDApLi4uIH07CiAgLy8gZmlyc3Qgdm9pZDogc2lsZW5jZSB2YXJpYWJsZSB1bnVzZWQgd2FybmluZwogIC8vIHVzZXMgYnJhY2VkLWluaXQtbGlzdCBpbml0aWFsaXphdGlvbiBydWxlcywgd2hpY2ggZXZhbHVhdGVzCiAgLy8gIHRoZSBlbGVtZW50cyBpbnNpZGUgYSBicmFjZWQtaW5pdC1saXN0IElOIE9SREVSLCB0byByZXBldGV0aXZlbHkKICAvLyAgZXhlY3V0ZSBhIGNlcnRhaW4gb3BlcmF0aW9uCiAgLy8gc2Vjb25kIHZvaWQgaXMgdG8gcHJldmVudCBtYWxpY2lvdXMgIm9wZXJhdG9yLCIgb3ZlcmxvYWRzLCB3aGljaAogIC8vICBjYW5ub3QgZXhpc3QgZm9yIHZvaWQgdHlwZXMKICAvLyAwIGF0IHRoZSBlbmQgaXMgdG8gaGFuZGxlIGVtcHR5IHZhcmlhZGljIHBhY2sgKHplcm8tc2l6ZSBhcnJheSBpbml0aWFsaXplciBpcyBpbGxlZ2FsLgogIHJldHVybiByZXN1bHQ7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjpjb3V0IDw8IGFkZCgxLDIsMyw0KSA8PCAnXG4nOwogICAgc3RkOjpjb3V0IDw8IGFkZCgpIDw8ICdcbic7Cn0=