如何访问兼容的 std::variant 变体?
How to access compatible std::variant variants?
#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
值?我相信这被称为通用多态性,相当于鸭子打字。
完全有效的用例。我想有很多方法可以做到这一点,但这里有一个:
std::visit([](auto&& val) { val.foo(); }, v);
您的初始代码不起作用的原因是 A::foo
与 B::foo
无关,因此要互换使用它们,您需要一个上下文,其中类型“包含”一个 foo
推导成员。在 visit
示例中,我们通过将可调用对象设为通用 lambda 来创建这样的上下文。
#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
值?我相信这被称为通用多态性,相当于鸭子打字。
完全有效的用例。我想有很多方法可以做到这一点,但这里有一个:
std::visit([](auto&& val) { val.foo(); }, v);
您的初始代码不起作用的原因是 A::foo
与 B::foo
无关,因此要互换使用它们,您需要一个上下文,其中类型“包含”一个 foo
推导成员。在 visit
示例中,我们通过将可调用对象设为通用 lambda 来创建这样的上下文。