Сегодня на cppreference наткнулся на пример создания визитера для std::visit на лету:
#include <string>
#include <variant>
#include <iostream>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
int main() {
std::variant<int, double, std::string> v = {std::string{"10"}};
std::visit(overloaded {
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << "\"" << arg << "\"" << ' '; },
}, v);
}
Красиво!