Здравствуйте, Анатолий Широков, Вы писали:
АШ>Сегодня на 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);
АШ>}
АШ>
АШ>Красиво!
К сожалению, довольно часто хочется полиморфного функтора с общей капчей. Приходится писать класс. А иначе дублируются данные.
Было бы хорошо иметь такой синтаксис
auto func = [&out] (int a) { Printf(out,"#8;",a); }
(const char *str) { Printf(out,"#32;",str); } ;