#include <iostream>
#include <utility>
#include <array>
class fooCaller {
public:
template <typename... Args>
void operator() (Args&&... args) const {
const auto v = {args...};
for (auto x : v) std::cout << x << ' '; std::cout << '\n';
}
};
template <typename> struct Foo;
template <std::size_t... Is>
struct Foo<std::index_sequence<Is...>> {
template <typename Container, typename F> // *** Modified
static void execute (const Container& v, F f) {
f(v[Is]...);
}
};
template <std::size_t N>
void fooArray (const std::array<int, N>& a) {
Foo<std::make_index_sequence<N>>::execute(a, fooCaller{});
}
int main() {
fooArray<6>({0,1,2,3,4,5});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGFycmF5PgoKY2xhc3MgZm9vQ2FsbGVyIHsKcHVibGljOgoJdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+Cgl2b2lkIG9wZXJhdG9yKCkgKEFyZ3MmJi4uLiBhcmdzKSBjb25zdCB7CgkgICAgY29uc3QgYXV0byB2ID0ge2FyZ3MuLi59OwoJICAgIGZvciAoYXV0byB4IDogdikgc3RkOjpjb3V0IDw8IHggPDwgJyAnOyAgICAgc3RkOjpjb3V0IDw8ICdcbic7Cgl9Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0cnVjdCBGb287Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QuLi4gSXM+CnN0cnVjdCBGb288c3RkOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4+IHsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIEY+ICAvLyAqKiogTW9kaWZpZWQKICAgIHN0YXRpYyB2b2lkIGV4ZWN1dGUgKGNvbnN0IENvbnRhaW5lciYgdiwgRiBmKSB7CiAgICAgICAgZih2W0lzXS4uLik7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4Kdm9pZCBmb29BcnJheSAoY29uc3Qgc3RkOjphcnJheTxpbnQsIE4+JiBhKSB7CiAgICBGb288c3RkOjptYWtlX2luZGV4X3NlcXVlbmNlPE4+Pjo6ZXhlY3V0ZShhLCBmb29DYWxsZXJ7fSk7Cn0KCmludCBtYWluKCkgewogICAgZm9vQXJyYXk8Nj4oezAsMSwyLDMsNCw1fSk7Cn0KCg==