#include <iostream>
#include <string>
#include <stdexcept>
#include <functional>
#include <utility>
template <typename... Args, typename F, size_t... ints>
void match_impl(size_t n, const std::tuple<Args...>& t, const F& f, std::integer_sequence<size_t, ints...> int_seq)
{
std::function<void()> fs[sizeof...(Args)] = {
[&]() { f(std::get<ints>(t)); }...
};
fs[n]();
}
template <typename... Args, typename F>
void match(size_t n, const std::tuple<Args...>& t, const F& f )
{
match_impl(n, t, f, std::index_sequence_for<Args...>{});
}
int main() {
auto tuple = std::make_tuple(1, '2', 3.33, std::string("abcdef"));
int tuple_index = 3;
auto visitor = [](const auto& tuple_value) {
std::cout << tuple_value << std::endl;
};
match(tuple_index, tuple, visitor);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHV0aWxpdHk+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncywgdHlwZW5hbWUgRiwgc2l6ZV90Li4uIGludHM+CnZvaWQgbWF0Y2hfaW1wbChzaXplX3QgbiwgY29uc3Qgc3RkOjp0dXBsZTxBcmdzLi4uPiYgdCwgY29uc3QgRiYgZiwgc3RkOjppbnRlZ2VyX3NlcXVlbmNlPHNpemVfdCwgaW50cy4uLj4gaW50X3NlcSkKewogIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmc1tzaXplb2YuLi4oQXJncyldID0gewogICAgWyZdKCkgeyBmKHN0ZDo6Z2V0PGludHM+KHQpKTsgfS4uLgogIH07CgogIGZzW25dKCk7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzLCB0eXBlbmFtZSBGPgp2b2lkIG1hdGNoKHNpemVfdCBuLCBjb25zdCBzdGQ6OnR1cGxlPEFyZ3MuLi4+JiB0LCBjb25zdCBGJiBmICkKewogIG1hdGNoX2ltcGwobiwgdCwgZiwgc3RkOjppbmRleF9zZXF1ZW5jZV9mb3I8QXJncy4uLj57fSk7Cn0KCmludCBtYWluKCkgewogIGF1dG8gdHVwbGUgPSBzdGQ6Om1ha2VfdHVwbGUoMSwgJzInLCAzLjMzLCBzdGQ6OnN0cmluZygiYWJjZGVmIikpOwoKICBpbnQgdHVwbGVfaW5kZXggPSAzOwoKICBhdXRvIHZpc2l0b3IgPSBbXShjb25zdCBhdXRvJiB0dXBsZV92YWx1ZSkgewogICAgc3RkOjpjb3V0IDw8IHR1cGxlX3ZhbHVlIDw8IHN0ZDo6ZW5kbDsKICB9OwoKICBtYXRjaCh0dXBsZV9pbmRleCwgdHVwbGUsIHZpc2l0b3IpOwoKICByZXR1cm4gMDsKfQ==