问题标签 [std-variant]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
132 浏览

c++ - std::variant 是否提供类似于 boost::variant<>::types 的功能?

boost::variant通过 公开其变体类型列表boost::variant<>::types,可以方便地与boost::mpl::for_each. std::variant缺少这样的成员。

我看到std::variant_alternative提供了。这可以用来生成boost::mpl::for_each可以摄取的类型列表吗?或者它是否支持不同的迭代策略?

0 投票
2 回答
737 浏览

c++ - 如果 std::variant 的析构函数包含 void* 数据,它会做什么

我刚刚开始std::variant在我的项目中使用。我有个疑问。std::variant下面显示的代码中的析构函数会做什么。Variant 保存void*数据。一旦变体超出范围,我认为它只会释放内存void*而不是指针指向的实际对象。所以在这种情况下会有内存泄漏。我想知道我的理解是否正确。

0 投票
1 回答
299 浏览

c++ - 将 std::variant 与 gmock 1.8 对象一起使用时编译错误

让我们使用 gmock 1.8 来编写这段代码:

尝试使用 clang++ 编译时,会出现以下编译错误:

(g ++的错误只说

)

当 MOCK_METHOD0 宏的行被注释掉时,代码编译正常。我确信在这种情况下调用的是复制构造函数(第 1081 行中的那个)。

这是为什么?如果我迁移到 gmock 1.10,问题会消失吗?还是不可能使用 gmock 模拟的变体?感谢您提供有关如何自己找到它的任何解释或提示。

0 投票
2 回答
664 浏览

c++ - 如何以多态方式使用替代类型的 std::variant

我正在编写一个解析器并使用 astd::variant来表示 AST 的节点。对于基本表达式,我有类似的东西:

(实际的结构定义稍后会出现,因为其中一些引用了Node.)

我发现这种方法比Node将抽象基类Add等声明为子类更好,因为它使我能够将使用 AST 的逻辑与 AST 本身分开。例如,评估表达式的代码可以std::visit在不需要Node虚拟evaluate方法或进行类型检查和向下转换的情况下使用。

我的问题是,我希望每个Node人都拥有一些字段,并且我希望在使用这些字段时能够以相同的方式对待所有 Node 变体。

我带来的唯一策略是:

  • 定义Node为具有公共字段和单独std::variant成员的结构。
  • 在每个备选方案中分别定义字段,并为每个字段定义一个具有选择该字段Node的成员的访问者。const auto &换句话说,只使用访问者。

还有其他方法吗?我真正想做的是定义一个带有字段的抽象基类,让所有Node替代品(Add等)从该类继承,然后能够说,“我不知道它std::variant包含什么替代品,但是我知道它们都是这个基类的实例,我只想把它当作那个类的一个实例。”</p>

0 投票
2 回答
498 浏览

c++ - std::visit 和 std::variant 用法

Promise::await_resume是一个简单的函数,它执行以下操作:

  1. 如果变体的值为std::exception_ptr,则重新抛出异常。
  2. 如果变体的值是T(而 T 由用户设置,也可能是 std::exception_ptr),则将其返回。如果 T 的类型为 void,则什么也不做。

最初我使用.index()check 和std::get. 它可以工作,但是会在std::get内部产生额外的检查以及std::__1::__throw_bad_variant_access()不会发生的事情:https ://godbolt.org/z/YnjxDy

我想根据cppreference使用 std::visit 优化代码,但无法编译。

另一个问题是,当 T 的类型是 std::exception_ptr 时,我怎么知道我是否应该抛出它?

0 投票
1 回答
46 浏览

c++ - 使用 std::variant 而不是编译时错误在缺少函数重载时引发异常

这是对这个问题的跟进

考虑以下代码

通过将越来越多的类型添加到 number 并可能具有依赖于 2 个以上参数的函数,很快就会清楚,我需要定义很多函数,即在 std::variant 中找到的所有可能的参数组合。

然而,并非所有组合都是可能的和/或需要的。如果我尝试调用未针对特定参数组合重载的函数,如何仅定义我需要的函数并引发异常?例如,假设我只想保留 add_(int, int) 或 add_(float, float) 函数。

0 投票
1 回答
1039 浏览

c++ - 在 C++ 中,我可以从 std::variant 中移出一些东西吗?

我有一个不可复制但可移动的资源包装类。像这样的东西(伪代码)

这一切都很好,但是我有很多这样的,我有一个函数可以解析一些数据并返回一个包装器或一个替代包装器。我想用std::variant返回值来表达这一点。例如

我可以编写这个函数,它全部编译。即我在 LoadData 函数中构造了一个 Wrapper,然后我可以将它移动到然后返回的变体中。

但另一方面,当我想取出值时,得到这个错误(MSVC2019)

我的代码看起来像这样。

这是有道理的,因为结果仍然存在,但是我该如何访问它呢?

0 投票
1 回答
51 浏览

c++ - std::visit 不识别类型

我很困惑,经过一些代码重构后,以下代码不再起作用,因为它跳转到auto, auto案例并忽略了该案例Complex, Complex。诚然,我不太明白重载到底在做什么,但对我来说,这两个代码看起来完全一样,除了一个直接获取它的参数,而另一个具有在函数体本身中定义的参数。

代码打印

这是重构之前的工作代码:

我唯一能想到的是,它obj1并不是obj2真正想要的类型,但打印std::cerr证明它们是。那么为什么 std::visit 不能识别它,我该如何解决呢?

0 投票
1 回答
200 浏览

c++ - 通过网络传递 std::variant 是否安全,跨平台

std::variant 是联合的替代品。

但是联合可以通过网络安全地在另一个平台(不同的编译器或架构)中接收。std::variant 可以这样做吗?

比如我有两台机器A和B。A是windows,MSVC 19.4。B 是 Linux、gcc(或其他编译器,例如 MSVC 17)。我在A(或B)下编译代码:

B 可以使用同一文件中的以下代码读取正确的值吗?

如果 std::variant 不能安全地通过网络。有没有图书馆提供?提升::变体?或者也许创建一个像 std::variant 一样的自定义实现?

0 投票
1 回答
102 浏览

c++ - 在`std::array 中做元素` 作为类成员默认初始化

考虑:

中的int元素是否data_归零,或者它们的值是不确定的?

通过扩展,在这种情况下也是如此:

编辑:

扩展:有没有办法可以从变体中获得所需的行为(初始化数据)。

如果我将这两个示例配对在一起,我应该能够做到: