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

标签 c++ c++20 variant

这个问题在这里已经有了答案:





Accessing common struct members in std::variant

(1 个回答)


3个月前关闭。



#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 value 不知道它的类型但知道它的属性?我相信这被称为相当于 Duck Typing 的通用多态性。

最佳答案

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

std::visit([](auto&& val) { val.foo(); }, v);
Demo
您的初始代码不起作用的原因是 A::fooB::foo 无关,因此要互换使用它们,您需要一个上下文,其中类型“包含”一个 foo成员被推导出来。在 visit例如,我们通过使可调用对象成为通用 lambda 来创建这样的上下文。

关于c++ - 如何访问兼容的 std::variant 变体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68623787/

相关文章:

c++ - 定义一个只有标题的类 - 找不到不存在的 cpp

c++ - 为什么 C++ 禁止非模板 std::类型的前向声明?

c++ - 如何将可变函数参数传递给 C++ 中的另一个函数(特别是 std::format)?

c++ - 为什么要使用Concept&Constraint

c++ - 在 VARIANT 和 _variant_t 之间复制

delphi - 从 EndOfTheMonth(date) 到 Variant 值的错误转换

c++ - boost::变体。 boost::重载函数的访问者

c++ - 如何从字符串中删除所有双空格

c++ - libxml2 错误处理

c++ - 如何更新 CMFCRibbonBar 中的最近文件列表