问题标签 [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 回答
113 浏览

c++ - 尝试将值存储到映射中的 std::variant 时出现 std::bad_variant_access 错误

我正在使用 std::variant 将文件解析为映射(以支持两种类型的值),但我无法找出将值存储到映射中的正确方法。

我得到一个:std::bad_variant_access

what():意外索引

这是地图定义:

这是解析函数:

uint16_t 解析没有问题。

我试图更改变体的顺序,使其成为 std::variant<float,uint16_t> 然后在 else 中失败。所以我知道我访问变体的方式是错误的(或者可能是因为地图没有初始化?)但我不知道如何修复它。

我应该使用 std::visit 而不是 std::get 吗?如果是这样,如何?

任何帮助将不胜感激。

谢谢。

0 投票
1 回答
389 浏览

c++ - 为 std::variant 提供 operator==

我正在尝试为地图中定义的运算符创建一个operator== 运算符,std::variant如下所示:

有人能告诉我为什么我的接线员不工作吗?

0 投票
2 回答
113 浏览

c++ - std::variant 的赋值运算符

我正在尝试使用 std::variant 将浮点数分配给我的 std::map 中的定义值。我以这种方式初始化了我的地图:

我正在尝试存档此操作:

如何将 std::map 键转换为浮点数以进行简单的算术运算?

0 投票
1 回答
39 浏览

c++ - 使用 std::variant<...> 时调用 BaseState 函数而不是 Derived 函数

我正在尝试使用最终状态机和 std::variant<..>

std::variant 将保存所有可能的状态状态将在 State 类中定义。

我想要的是有一个 BaseState 类,应该在其中处理“通用事件”。使用派生的 State 类处理特定的状态。

我的问题在于on_event功能。

Basestate中的 Reset 有一个特定的,void on_event(const Reset &r); 而 LightOn 和 LightOff 中有一个更通用的void on_event(const Event &e);(使用 Event = std::variant<Toggle,Reset>;)

但是当我这样做时

来自 LightOn 的 on_event 被调用,而不是来自 BaseState 的那个。

有没有办法实现:当 BaseState 函数可用于此特定事件时调用 BaseState 函数?

0 投票
2 回答
631 浏览

c++ - 在模板中使用 std::variant 的 emplace 函数

我正在尝试使用最终状态机和 std::variant<..>

std::variant 将保存所有可能的状态状态将在 State 类中定义。

我想将 std::monostate 作为第一种状态变体,以将其用作“不更改状态”值。所以定义是:第一种是std::monostate,第二种是fsm的初始状态。

由于 std::variant 被初始化为它的第一个元素,我想在构造函数中使用 emplace<1> 。

但这会产生编译时错误:

但是,当我在非模板代码中使用相同的构造时:

emplace 功能是否有使用限制?

0 投票
1 回答
268 浏览

c++ - Compare std::variant with int using C++20 <=> is not a constant expression

Since the std::variant is not allowed to compare with one of its alternative types in the standard library, I am implementing the compare function using C++20 <=> operator:

But when I testing the above function with my own defined std::variant:

The second assertion couldn't compile, GCC says:

Why is v2 < 2 not a constant expression? or it's just a GCC bug? Weirder, when I change the second assertion to compare with double, this can compile:

Update:

Clang can pass three assertions, but MSVC can only pass the third assertion, it seems MSVC also has a bug.

0 投票
3 回答
4194 浏览

c++ - 我如何编写类似 std::variant 的开关之类的代码?

我有一些var = std::variant<std::monostate, a, b, c>什么时候a, b, c是一些类型。

如何在运行时检查var包含什么类型?

在官方文档中,我发现如果var包含a类型的信息,我写std::get<b>(var)了我得到一个异常。所以我想到了这个解决方案:

但它是如此复杂和丑陋!有没有更简单的方法来检查std::variant包含什么类型?

0 投票
2 回答
330 浏览

c++ - 如何访问 std::variant 中的类型?

我需要构建一个可以具有多种类型的类的向量,如下所示:

这是头文件Field.h

当我尝试访问getName()函数时,Visual Studio 不断给我以下消息错误:

E0135 类 "std::variant<Field, Fieldstd::string, Field>" 没有成员 "getName"
C2039 'getName': 不是 'std::variant<Field,Fieldstd::string,Field>' 的成员

但它工作得很好,如果我这样定义我的向量:

我怎样才能解决这个问题?

0 投票
4 回答
373 浏览

c++ - 默认构造 std::variant 中的所有类型并将它们放入 std::vector

我将如何制作一个std::vector包含 a 中包含的所有类型的默认构造实例的 a std::variant

0 投票
2 回答
337 浏览

c++ - std::variant 类型的向量到 std::tuple

我正在研究 std::variant 类型的向量。有没有办法将它转换为给定 std::variants 所持有的值的 std::tuple ?

例如,我想要像这样的元组:

其中成员是向量中连续变体所持有的类型。