#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.template operator()<const typename tuple_element<index, Tuple>::type&, 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 #3: "Each with index as compile-time parameter" callback */
template <typename T, size_t index>
void operator ()(T&& ) {}
};
void Example_Usage()
{
}
int main() {
tuple<int, bool, string> t;
tuple_each(t, demo_functor_each());
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx1dGlsaXR5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRnVuYywgc2l6ZV90Li4uIGluZGV4Pgp2b2lkIHR1cGxlX2VhY2hfaW50ZXJuYWwoVHVwbGUgY29uc3QgJiB0dXBsZSwgRnVuYyBmdW5jLCBpbmRleF9zZXF1ZW5jZTxpbmRleC4uLj4pCnsKCWF1dG8gcmVzID0gewoJICAgIChmdW5jLnRlbXBsYXRlIG9wZXJhdG9yKCk8Y29uc3QgdHlwZW5hbWUgdHVwbGVfZWxlbWVudDxpbmRleCwgVHVwbGU+Ojp0eXBlJiwgaW5kZXg+KGdldDxpbmRleD4odHVwbGUpKSwKCSAgICAgbnVsbHB0cikuLi4KCX07Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUdXBsZSwgdHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSW5kaWNlcyA9IG1ha2VfaW5kZXhfc2VxdWVuY2U8dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlPj4Kdm9pZCB0dXBsZV9lYWNoKFR1cGxlIGNvbnN0ICYgdHVwbGUsIEZ1bmMgZnVuYykKewogICAgdHVwbGVfZWFjaF9pbnRlcm5hbCh0dXBsZSwgZnVuYywgSW5kaWNlcygpKTsKfQoKc3RydWN0IGRlbW9fZnVuY3Rvcl9lYWNoIHsKCiAgICAvKiBDYXNlICMxOiAiRWFjaCIgY2FsbGJhY2sgKi8KICAgIC8vdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAvL3ZvaWQgb3BlcmF0b3IgKCkoVCYmIHQpIHsgOyB9CgogICAgLyogQ2FzZSAjMjogIkVhY2ggd2l0aCBpbmRleCBhcyBydW4tdGltZSBwYXJhbWV0ZXIiIGNhbGxiYWNrICovCiAgICAvL3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgLy92b2lkIG9wZXJhdG9yICgpKGNvbnN0IHNpemVfdCBpbmRleCwgVCYmIHQpIHsgOyB9CgogICAgLyogQ2FzZSAjMzogIkVhY2ggd2l0aCBpbmRleCBhcyBjb21waWxlLXRpbWUgcGFyYW1ldGVyIiBjYWxsYmFjayAqLwogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBpbmRleD4KICAgIHZvaWQgb3BlcmF0b3IgKCkoVCYmICkge30KCn07Cgp2b2lkIEV4YW1wbGVfVXNhZ2UoKQp7Cgp9CgoKaW50IG1haW4oKSB7CiAgICB0dXBsZTxpbnQsIGJvb2wsIHN0cmluZz4gdDsKICAgIHR1cGxlX2VhY2godCwgZGVtb19mdW5jdG9yX2VhY2goKSk7Cn0=