什么是类型此结构是继承?

Jon*_*Mee 5 c++ operators specialization template-inheritance variadic-templates

所以这个例子来自:http://en.cppreference.com/w/cpp/utility/variant/visit声明了专门的类型:

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
Run Code Online (Sandbox Code Playgroud)

这里构造为r值:

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);
Run Code Online (Sandbox Code Playgroud)

我试图弄清楚它是如何工作的.overloaded从这里继承的类型是什么?它看起来像是一群lambdas,但我不知道它会如何operator().有人可以解释继承在这里是如何工作的吗?

nwp*_*nwp 6

overloaded从每个lambda单独继承,每个lambda都有一个call运算符.因此,您创建一个在一个重载集中包含所有调用操作符的结构.只要它们不模糊,就会自动选择正确的.

您可以想象要扩展到的可变参数模板

struct overloaded :
    // inherits from
    decltype([](auto arg) { std::cout << arg << ' '; }),
    decltype([](double arg) { std::cout << std::fixed << arg << ' '; }),
    decltype([](const std::string& arg) { std::cout << std::quoted(arg) << ' '; })

    // has three operator()s
    {
        using decltype([](auto arg) { std::cout << arg << ' '; })::operator();
        using decltype([](double arg) { std::cout << std::fixed << arg << ' '; })::operator();
        using decltype([](const std::string& arg) { std::cout << std::quoted(arg) << ' '; })::operator();
    };
Run Code Online (Sandbox Code Playgroud)

除了实际代码之外,它不起作用,因为具有相同主体的lambda仍然具有不同的类型.

它创建了一个overloaded每个实例具有多个继承的类型.