从cppreference看这个std :: visit的例子,我很难理解这个编译和工作的确切方式。 在第12行中,定义了一个函数模板'overloaded',但没有提供该函数的实现。这个函数以某种方式(?)被第17行中的std :: visit用来推断基于三个lambdas的'struct overloaded'的类型。
这是如何工作的?
真正得到的是模板函数'overloaded'必须与'struct overloaded'具有相同的名称才能编译。那些相关的是什么? 我的想法是'模板函数重载'用于为编译器声明类型'struct overloaded'。但后来我不明白为什么必须在第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);
}
}