问题标签 [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 投票
3 回答
726 浏览

c++ - 按给定条件拆分给定 std::variant 类型

如何通过给定的变体类型

声明两种变体类型

whereV1包括来自 的所有算术类型VV2包括来自 的所有非算术类型V

V可以是模板类的参数,例如:

一般来说,标准可以是这样的constexpr变量:

0 投票
1 回答
501 浏览

c++ - 如何在 lambda 中调用 std::visit,访问者是由值捕获的函数对象

std::visit使用作为值捕获的函数对象的访问者在 lambda中调用似乎并不简单。不过,通过引用捕获效果很好。为什么会这样,是否有可能做到这一点?

在这种情况下,我不理解来自 MSVC 2017 的编译错误消息:

std::visit': 找不到匹配的重载函数
无法专门化函数模板未知类型 std::visit(_Callable &&,_Variants &&...)

我假设模板参数推导的行为与仅在std::visit没有包装调用的 lambda 的情况下调用非常相似。

说明问题的代码:

0 投票
2 回答
1113 浏览

c++ - std::visit 带有重载自由函数而不是函数对象的 std::variant

在 C++17 中是否有一种简单的方法来 std::visit 具有重载自由函数的变体,或者我必须使用具有重载调用运算符的对象?

换句话说,是否可以添加一些简单的东西以使以下//ERROR!行编译为与该行功能相同//OK!

0 投票
2 回答
338 浏览

c++ - 将变体转换为超集变体或子集变体

我已经从这个答案改编了一些代码来处理目标变体是源变体的子集的情况,如下所示:

上述方法有效,但我希望它能够处理在编译时可以检测到错误转换的情况。以上处理了运行时所有错误的转换,但运行时和编译时错误都是可能的。如果 v 持有 C 类型的值,则将 v类型std::variant<A,B,C>转换为std::variant<A,B>应该在运行时失败,但是例如

甚至不应该编译。

我相信这可以通过 std::enable_if 完成,但我不确定它似乎需要测试可变参数包的集合包含,我不知道该怎么做。

0 投票
0 回答
530 浏览

c++ - std::variant '试图引用已删除的函数'

尝试编译时出现错误:Error C2280 'std::variant<Tree::Position<int>,Tree::Position<std::string>,Tree::Position<double>,Tree::Position<bool>>::variant(const std::variant<Tree::Position<int>,Tree::Position<std::string>,Tree::Position<double>,Tree::Position<bool>> &)': attempting to reference a deleted function

我有一个带有模板子类位置的树类。使用 Tree 类的加载功能时,会将 Position 类的实例添加到 Tree 的treePositionList. 同样在 Position 类的构造函数中,Position 类的一个实例被添加到它的childenList. 我认为问题与向这些列表中添加实例有关,尽管我不明白到底出了什么问题。

0 投票
1 回答
285 浏览

c++ - 将 Boost Spirit 解析器从 boost::variant 转换为 std::variant

我目前正在尝试将一些代码从使用 boost::variant 以支持 std::variant 移开,但遇到了一个我无法弄清楚的问题。下面是一个最小的测试用例:

错误的魔杖盒

认为正在发生的是解析器试图将 int 直接分配给 type 的值Base,但由于 int 不直接映射到 std::string 或 boost::recursive_wrapper<>,它会变得不安(我的意思是 11 页的编译器错误)。不知何故, boost::variant 避免了这个问题。请问有什么线索吗?

0 投票
1 回答
115 浏览

c++ - 访问者修改变体的 std::variant 访问者

在访问者函数中修改变体是否安全?

在上面示例中的字符串引用函数中,我假设字符串引用在分配新值之前是有效的。但是标准是否说明了这个用例的有效性?

0 投票
1 回答
124 浏览

c++ - 为什么 std::variant 与比较类不在同一命名空间时找不到 operator<()

我试图为operator<来自外部库的类提供自定义。此类在该库的名称空间内,但是,我想定义的运算符不在。现在,如果我定义 astd::variant并想在 a 中使用它std::set,编译将失败,因为它无法检测到operator<. 这是一个示例(神螺栓):

如果你把operator<s 放在命名空间中myClasses,它编译得很好。有人可以向我解释一下,为什么我最初的尝试失败了?如果我只是比较 myClasses::classA(1) < myClasses::classA(2),则无需将运算符放在myClasses命名空间中。非常感谢您提前。

0 投票
2 回答
108 浏览

c++ - 您如何在语法方面使 std::variants 的使用更“可口”?

这是由我给新手用户的答案所激发的,我建议他们使用 anstd::variant而不是 union。

使用工会,您可能会遇到以下情况:

(不完全是原始问题的内容,我在这里取得了一些诗意的许可。)并且使用变体,该类可能如下所示:

问题是,使用第一个变体,我可以写

并且只要我已经确定会有子框,这将起作用。

有了std::variant,我必须写:

我觉得第二个版本的可读性要差得多,有点混乱,而且很分散注意力。另外-我必须知道boxes.

在我的代码中,我可以做些什么来让我的用户不必进行这种std::get()调用,并使他们的生活更愉快?

0 投票
1 回答
134 浏览

c++ - 为什么 clang 处理这个琐碎的 std::variant 代码的异常?

如果我们有这样的代码:

https://gcc.godbolt.org/z/oqGiHs

如果您使用 clang 编译,它会在swap.

这是为什么?两种变体都是非空的,并且底层类型是异常安全的。

更新:

具有讽刺意味的是,这无一例外地编译: