如何访问兼容的 std::variant 变体?

Vor*_*rac 4 c++ variant c++20

#include <variant>


struct A
{
    void foo(){}
};


struct B
{
    void foo(){}
};

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

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

Nik*_*iou 6

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

std::visit([](auto&& val) { val.foo(); }, v);
Run Code Online (Sandbox Code Playgroud)

演示

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