std ::访问lambdas而不是访问者类

时间:2017-12-17 14:36:56

标签: c++ lambda c++17 visitor

从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);
    }
}   

0 个答案:

没有答案
相关问题