When accessing variables in the std::variant, we use the global function std::visit(). As you might have guessed, we have to use our main companion when dealing with heterogeneous types; the polymorphic lambda:
std::visit( [](const auto& v){ std::cout << v; }, my_variant );
The compiler then generates a regular C++ of the lambda, for every type contained in the variant. Thus, when invoking std::visit() with the lambda and variant type in the example, the compiler would generate code roughly similar to the following snippet where the polymorphic lambda is converted to a regular class with operator() overloads for every type in the variant