#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});
}

