【问题标题】:What is the Type This struct is Inheriting From?这个结构继承自什么类型?
【发布时间】:2017-06-07 13:51:09
【问题描述】:

所以this example from: 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...>;

这里构造为 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);

我正试图弄清楚这是如何工作的。 overloaded 从这里继承的类型是什么?它看起来像是一个 lambda 数组,但我看不出它会有一个operator()。有人可以解释这里的继承是如何工作的吗?

【问题讨论】:

  • 如果你超过 10k,你可以看到我刚刚尝试了这个问题:stackoverflow.com/q/44414238/2642059@BaummitAugen 帮助我识别了继承。所以我想我现在问的问题是正确的。

标签: c++ operators variadic-templates specialization template-inheritance


【解决方案1】:

overloaded 分别从每个 lambda 继承,每个 lambda 都有一个调用运算符。因此,您创建了一个结构,该结构在一个重载集中包含所有调用运算符。只要它们不模棱两可,就会自动选择正确的。

你可以想象要扩展成的可变参数模板

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

除非在实际代码中,否则它不会工作,因为具有相同主体的 lambda 仍然具有不同的类型。

它创建 1 个overloaded 类型,每个实例具有多重继承。

【讨论】:

  • 显然你比我更了解这个话题......那么我是在创建一个具有多重继承的overloaded 对象吗?或者可能是 3 个overloaded 对象?
  • @JonathanMee 您正在传递一个对象,该对象具有三个运算符,这些运算符依次调用您从中派生的三个 lambda 之一。最后,您可以只创建一个类型并自己提供这些运算符,这只是示例的简写。
  • @BartekBanachewicz 这似乎与nwp 所说的不一致。他似乎认为我正在传递 3 个单独的 lambda。
  • @JonathanMee 我不知道你是怎么得到这种印象的。
  • @JonathanMee 这是一个deduction guide 告诉编译器如果overloaded 是用-&gt; 左边的语法构造的,那么它应该被推导出为-&gt; 右边的类型使您不必指定模板参数。
猜你喜欢
  • 2021-07-25
  • 2020-08-30
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2011-06-11
  • 2019-08-20
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多