```cpp // // Created by allspark on 4/14/19. // #include #include #include template struct VariantVisitor : B { VariantVisitor(B&& b) : B(std::move(b)) {} VariantVisitor(B const& b) : B(b) {} using B::operator(); template void operator()(std::variant const& v) { std::visit(static_cast(*this), v); } }; template void my_visit_impl(VISITOR&& visitor, std::tuple const& tuple, std::index_sequence) { VariantVisitor> new_v(std::forward(visitor)); (new_v(std::get(tuple)),...); } template void my_visit(VISITOR&& visitor, std::tuple const& tuple) { return (my_visit_impl(std::forward(visitor), tuple, std::make_index_sequence{})); } int main() { std::tuple> v{1, 5, 42}; // std::tuple v{"hello", "world"}; my_visit([](auto const& value){ std::cout << typeid(decltype(value)).name() << '\n'; std::cout << "value: " << value << '\n'; }, v); } ```