#include <functional>
#include <iostream>
#include <tuple>
#include <type_traits>
#include <utility>
using namespace std;
template <typename Tuple, typename F, size_t begin, size_t end>
enable_if_t<begin == end || tuple_size<Tuple>::value < end> for_each(Tuple&, F&&) {
}
template <typename Tuple, typename F, size_t begin = 0U, size_t end = tuple_size<Tuple>::value>
enable_if_t<begin < end && tuple_size<Tuple>::value >= end> for_each(Tuple& t, F&& f) {
f(get<begin>(t));
for_each<Tuple, F, begin + 1, end>(t, forward<F>(f));
}
int main() {
auto t = make_tuple(3.14, "Hello World!", -1);
auto f = [](const auto& i) { cout << i; };
for_each<decltype(t), decltype(f), 1>(t, forward<decltype(f)>(f));
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRiwgc2l6ZV90IGJlZ2luLCBzaXplX3QgZW5kPgplbmFibGVfaWZfdDxiZWdpbiA9PSBlbmQgfHwgdHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlIDwgZW5kPiBmb3JfZWFjaChUdXBsZSYsIEYmJikgewp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEYsIHNpemVfdCBiZWdpbiA9IDBVLCBzaXplX3QgZW5kID0gdHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlPgplbmFibGVfaWZfdDxiZWdpbiA8IGVuZCAmJiB0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUgPj0gZW5kPiBmb3JfZWFjaChUdXBsZSYgdCwgRiYmIGYpIHsKCWYoZ2V0PGJlZ2luPih0KSk7Cglmb3JfZWFjaDxUdXBsZSwgRiwgYmVnaW4gKyAxLCBlbmQ+KHQsIGZvcndhcmQ8Rj4oZikpOwp9CgoKCmludCBtYWluKCkgewoJYXV0byB0ID0gbWFrZV90dXBsZSgzLjE0LCAiSGVsbG8gV29ybGQhIiwgLTEpOwoJYXV0byBmID0gW10oY29uc3QgYXV0byYgaSkgeyBjb3V0IDw8IGk7IH07CgoJZm9yX2VhY2g8ZGVjbHR5cGUodCksIGRlY2x0eXBlKGYpLCAxPih0LCBmb3J3YXJkPGRlY2x0eXBlKGYpPihmKSk7Cn0=