Re: [FYI] С++17: Генерация визитера для std::variant на лету
От: Шахтер Интернет  
Дата: 02.10.17 16:44
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Сегодня на 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); } ;
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.