#include <iostream>
#include <array>
template<class... Args>
void f(Args&... args)
{
for(const auto& a : {args...})
{
std::cout<<a<<std::endl;
}
}
namespace Helper {
template<unsigned int N,unsigned int I >
struct Caller
{
template<class T, class...Args>
static void call( const std::array<T,N>& arr, Args... args )
{
Caller<N,I-1>::call( arr, std::get<I-1>(arr), args... );
}
};
template <unsigned int N>
struct Caller<N, 0>
{
template< class T, class...Args>
static void call(const std::array<T,N>& arr, Args&... args)
{
f(args...);
}
};
}
template<typename T, unsigned N>
void call_f(const std::array<T,N>& arr)
{
Helper::Caller<N,N>::call(arr);
}
int main() {
std::array<float,3> array = {4.3, 3.14,2.1} ;
call_f(array);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+IAoKdGVtcGxhdGU8Y2xhc3MuLi4gQXJncz4Kdm9pZCBmKEFyZ3MmLi4uIGFyZ3MpCnsKCWZvcihjb25zdCBhdXRvJiBhIDoge2FyZ3MuLi59KQoJewoJCXN0ZDo6Y291dDw8YTw8c3RkOjplbmRsOwoJfQp9CiAKIApuYW1lc3BhY2UgSGVscGVyIHsKdGVtcGxhdGU8dW5zaWduZWQgaW50IE4sdW5zaWduZWQgaW50IEkgPiAKc3RydWN0IENhbGxlciAKewogICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MuLi5BcmdzPgogICAgc3RhdGljIHZvaWQgY2FsbCggY29uc3Qgc3RkOjphcnJheTxULE4+JiBhcnIsIEFyZ3MuLi4gYXJncyAgKQogICAgewoJICAgIENhbGxlcjxOLEktMT46OmNhbGwoIGFyciwgc3RkOjpnZXQ8SS0xPihhcnIpLCBhcmdzLi4uICk7CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8dW5zaWduZWQgaW50IE4+CnN0cnVjdCBDYWxsZXI8TiwgMD4KewogICAgdGVtcGxhdGU8IGNsYXNzIFQsIGNsYXNzLi4uQXJncz4KICAgIHN0YXRpYyB2b2lkIGNhbGwoY29uc3Qgc3RkOjphcnJheTxULE4+JiAgYXJyLCBBcmdzJi4uLiBhcmdzKQogICAgewogICAgICAgIGYoYXJncy4uLik7CiAgICB9Cn07Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CnZvaWQgY2FsbF9mKGNvbnN0IHN0ZDo6YXJyYXk8VCxOPiYgYXJyKQp7CglIZWxwZXI6OkNhbGxlcjxOLE4+OjpjYWxsKGFycik7Cn0KaW50IG1haW4oKSB7CiAKCXN0ZDo6YXJyYXk8ZmxvYXQsMz4gYXJyYXkgPSB7NC4zLCAzLjE0LDIuMX0gOwogCgljYWxsX2YoYXJyYXkpOwoJcmV0dXJuIDA7Cn0K