При просмотре страницы std::visit()
в cppreference,
https://en.cppreference.com/w/cpp/utility/variant/visit, я столкнулся с кодом, который я не могу понять...
Вот сокращенная версия:
#include <iomanip>
#include <iostream>
#include <string>
#include <type_traits>
#include <variant>
#include <vector>
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...)->overloaded<Ts...>;
int main() {
std::vector<std::variant<int,long,double,std::string>> vec = { 10, 15l, 1.5, "hello" };
for (auto& v : vec) {
std::visit(overloaded{
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
}
}
Что означают две строки, обозначающие overloaded
чуть выше int main()
?
Спасибо за объяснение!
Дополнение 2019 года
После того, как два джентльмена ниже предоставили подробные объяснения (большое спасибо!), Я наткнулся на тот же код в очень хорошей книге C++ 17 в деталях -
Изучите захватывающие особенности нового стандарта C++! Бартломей Филипек. Такая хорошо написанная книга!