#include <iostream>
#include <string>
#include <tuple>
#include <utility>
using namespace std;
template <typename Tuple, typename Func, size_t... index>
void tuple_each_internal(Tuple const & tuple, Func func, index_sequence<index...>)
{
auto res = {
(func(std::integral_constant<std::size_t, index>{}, get<index>(tuple)),
nullptr)...
};
}
template <typename Tuple, typename Func, typename Indices = make_index_sequence<tuple_size<Tuple>::value>>
void tuple_each(Tuple const & tuple, Func func)
{
tuple_each_internal(tuple, func, Indices());
}
struct demo_functor_each {
/* Case #1: "Each" callback */
//template <typename T>
//void operator ()(T&& t) { ; }
/* Case #2: "Each with index as run-time parameter" callback */
//template <typename T>
//void operator ()(const size_t index, T&& t) { ; }
/* Case #5: "Each with index as compile-time parameter" callback */
template <size_t N, typename T>
void operator ()(std::integral_constant<std::size_t, N>, T&& t) { std::cout << N << ":" << t << std::endl; }
};
int main() {
tuple<int, bool, string> t{42, false, "Hello"};
tuple_each(t, demo_functor_each());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRnVuYywgc2l6ZV90Li4uIGluZGV4Pgp2b2lkIHR1cGxlX2VhY2hfaW50ZXJuYWwoVHVwbGUgY29uc3QgJiB0dXBsZSwgRnVuYyBmdW5jLCBpbmRleF9zZXF1ZW5jZTxpbmRleC4uLj4pCnsKCWF1dG8gcmVzID0gewoJICAgIChmdW5jKHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIGluZGV4Pnt9LCBnZXQ8aW5kZXg+KHR1cGxlKSksCgkgICAgIG51bGxwdHIpLi4uCgl9Owp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGUsIHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEluZGljZXMgPSBtYWtlX2luZGV4X3NlcXVlbmNlPHR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZT4+CnZvaWQgdHVwbGVfZWFjaChUdXBsZSBjb25zdCAmIHR1cGxlLCBGdW5jIGZ1bmMpCnsKICAgIHR1cGxlX2VhY2hfaW50ZXJuYWwodHVwbGUsIGZ1bmMsIEluZGljZXMoKSk7Cn0KCnN0cnVjdCBkZW1vX2Z1bmN0b3JfZWFjaCB7CgogICAgLyogQ2FzZSAjMTogIkVhY2giIGNhbGxiYWNrICovCiAgICAvL3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgLy92b2lkIG9wZXJhdG9yICgpKFQmJiB0KSB7IDsgfQoKICAgIC8qIENhc2UgIzI6ICJFYWNoIHdpdGggaW5kZXggYXMgcnVuLXRpbWUgcGFyYW1ldGVyIiBjYWxsYmFjayAqLwogICAgLy90ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIC8vdm9pZCBvcGVyYXRvciAoKShjb25zdCBzaXplX3QgaW5kZXgsIFQmJiB0KSB7IDsgfQoKICAgIC8qIENhc2UgIzU6ICJFYWNoIHdpdGggaW5kZXggYXMgY29tcGlsZS10aW1lIHBhcmFtZXRlciIgY2FsbGJhY2sgKi8KICAgIHRlbXBsYXRlIDxzaXplX3QgTiwgdHlwZW5hbWUgVD4KICAgIHZvaWQgb3BlcmF0b3IgKCkoc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzdGQ6OnNpemVfdCwgTj4sIFQmJiB0KSB7IHN0ZDo6Y291dCA8PCBOIDw8ICI6IiA8PCB0IDw8IHN0ZDo6ZW5kbDsgfQoKfTsKCmludCBtYWluKCkgewogICAgdHVwbGU8aW50LCBib29sLCBzdHJpbmc+IHR7NDIsIGZhbHNlLCAiSGVsbG8ifTsKICAgIHR1cGxlX2VhY2godCwgZGVtb19mdW5jdG9yX2VhY2goKSk7Cn0=