#include <iostream>
#include <functional>
#include <vector>
template<typename Arg>
auto func(Arg arg)
-> decltype(arg(), void())
{
arg();
}
template<typename Container>
auto func(Container& c)
-> decltype(c.rbegin() != c.rend(), (*c.rbegin())(), void())
{
for (auto it = c.rbegin(); it != c.rend(); ++it)
{
(*it)();
}
}
template <typename ...Ts>
void funcs(Ts&&... args)
{
const int dummy[] = {(func(std::forward<Ts>(args)), 0)..., 0};
static_cast<void>(dummy); // Avoid warning for unused variable
// Or in C++17:
// (func(std::forward<Ts>(args)), ...);
}
void f()
{
std::cout << "+" ;
}
int main()
{
funcs(f,f,f); // #1
std::cout << std::endl;
std::vector<std::function<void()> > v{f,f};
funcs(v, f, v); // #2
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnRlbXBsYXRlPHR5cGVuYW1lIEFyZz4KYXV0byBmdW5jKEFyZyBhcmcpCi0+IGRlY2x0eXBlKGFyZygpLCB2b2lkKCkpCnsgIAogICAgYXJnKCk7Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lcj4KYXV0byBmdW5jKENvbnRhaW5lciYgYykKLT4gZGVjbHR5cGUoYy5yYmVnaW4oKSAhPSBjLnJlbmQoKSwgKCpjLnJiZWdpbigpKSgpLCB2b2lkKCkpCnsKICAgIGZvciAoYXV0byBpdCA9IGMucmJlZ2luKCk7IGl0ICE9IGMucmVuZCgpOyArK2l0KSAKICAgIHsgCiAgICAgICAgKCppdCkoKTsKICAgIH0gCn0KCnRlbXBsYXRlIDx0eXBlbmFtZSAuLi5Ucz4Kdm9pZCBmdW5jcyhUcyYmLi4uIGFyZ3MpIAp7CiAgICBjb25zdCBpbnQgZHVtbXlbXSA9IHsoZnVuYyhzdGQ6OmZvcndhcmQ8VHM+KGFyZ3MpKSwgMCkuLi4sIDB9OwogICAgc3RhdGljX2Nhc3Q8dm9pZD4oZHVtbXkpOyAvLyBBdm9pZCB3YXJuaW5nIGZvciB1bnVzZWQgdmFyaWFibGUKCiAgICAvLyBPciBpbiBDKysxNzoKICAgIC8vIChmdW5jKHN0ZDo6Zm9yd2FyZDxUcz4oYXJncykpLCAuLi4pOwp9Cgp2b2lkIGYoKQp7CiAgICBzdGQ6OmNvdXQgPDwgIisiIDsKfQoKaW50IG1haW4oKQp7CiAgICBmdW5jcyhmLGYsZik7IC8vICMxCgogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gPiB2e2YsZn07CiAgICBmdW5jcyh2LCBmLCB2KTsgLy8gIzIKfQo=