【问题标题】:How to access compatible std::variant variants? [duplicate]如何访问兼容的 std::variant 变体? [复制]
【发布时间】:2021-08-02 14:57:33
【问题描述】:
#include <variant>


struct A
{
    void foo(){}
};


struct B
{
    void foo(){}
};

int main()
{
    std::variant< A, B > v{ A{} };
    v.foo();  // doesn't work
}

如何在不知道它的类型但知道它的属性的情况下使用std::variant 值?我相信这被称为等同于 Duck Typing 的通用多态性。

【问题讨论】:

    标签: c++ c++20 variant


    【解决方案1】:

    完全有效的用例。我想有很多方法可以做到这一点,但这里有一个:

    std::visit([](auto&& val) { val.foo(); }, v);
    

    Demo

    您的初始代码不起作用的原因是因为A::fooB::foo 无关,因此要互换使用它们,您需要一个上下文,其中推断出“包含”foo 成员的类型。在visit 示例中,我们通过将可调用对象设为通用 lambda 来创建这样的上下文。

    【讨论】:

      猜你喜欢
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多