Глядя на этот пример для std :: visit из cppreference, мне трудно понять, как именно это компилируется и работает. В строке 12 определен шаблон функции «перегружен», но реализация для функции не предоставляется. Эта функция каким-то образом (?) Используется std :: visit в строке 17 для определения типа «структуры, перегруженной» на основе трех лямбда-выражений.
Как это работает?
И что я действительно понял, так это то, что функция шаблона «перегружена» должна иметь то же имя, что и «структура перегружена», чтобы она могла компилироваться. Как это связано? Я думал, что «функция шаблона перегружена» была использована для объявления типа «структура перегружена» для компилятора. Но тогда я не понимаю, почему фигурные скобки должны использоваться в строке 17. Почему не функциональные скобки?
Почему это работает, ускользает от меня.
#include <iomanip>
#include <iostream>
#include <string>
#include <variant>
#include <vector>
template<class T> struct always_false : std::false_type {};
using var_t = std::variant<int, long, double, std::string>;
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; // Line 12
int main() {
std::vector<var_t> vec = {10, 15l, 1.5, "hello"};
for (auto& v: vec) {
std::visit(overloaded { // Line 17
[](auto arg) { std::cout << arg << ' '; },
[](double arg) { std::cout << std::fixed << arg << ' '; },
[](const std::string& arg) { std::cout << std::quoted(arg) << ' '; },
}, v);
}
}