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

c++ - 使用 std::variant> 作为灵活的输入而不是子类化

我有一个接受输入的类,有时我想通过分配一个变量来设置该输入,而在其他时候我希望该类调用一个函数来获取它的输入。

过去,我只是使用 astd::function<T()>作为输入,并设置一个 lambda 来返回某个外部变量的值,但我正试图摆脱过度使用std::function. 所以我想出了std::variant<T, std::function<T()>>

如此实现:

并因此灵活使用:

这是对仅使用 astd::function<T()>作为输入和使用foo = []{return 42;}固定输入值的改进吗?

另一种方法是为分配的输入和调用的输入创建单独的子类,但是当有多个输入时会导致组合爆炸。我还有其他选择吗?

0 投票
2 回答
644 浏览

c++ - boost::polycollection、std::variant 还是 CRTP?

假设“标准”C++ 继承范式:

我想要一个对迭代最有效的实现,即最小化间接引用,最大化内联优化等。为了限制问题,我事先知道我想要实现的每个特定“类型”(我可以只定义我需要的“func”类型,而不必允许其他可能性)。

出现几个可用的选项:

boost::polycollection

标准::变体

或 CRTP(Curiously Recurring Template Pattern 让我知道正确的命名法,但在这里我根据“类型”“向上转换”基类——一种手动调度。

我可以为了便于开发而牺牲边际效率,但是在这种情况下是否对“最佳实践”达成共识?

EDITS* 修正了一些错别字;我目前的开发是CRTP的“开发中”最后一个选项。

解决方案:

经过测试, boost::polycollection 和 std::variant 都是有效的方法。然而,事实证明这是最有效的(根据记忆,可能略有偏差)。

0 投票
1 回答
765 浏览

c++ - std::variant 的 std::vector 的内存布局如何?

我在堆栈中分配了一种类型std::vectorstd::variant由于每个变体的大小都是可变的。我想知道向量的内存布局在堆栈中是什么。

0 投票
1 回答
70 浏览

c++ - 为什么`std:variant`的`operator=(T&& t)`的noexcept规范不依赖于内部类型的析构函数的noexcept规范?

长标题:为什么std:variant'soperator=(T&& t)的 noexcept 规范不依赖于内部类型的析构函数的 noexcept 规范?

我可以在cppreference上看到

所以编译:

但它调用FooThrow的析构函数是noexcept(false)

好像不太对。我错过了什么吗?

0 投票
1 回答
1954 浏览

c++ - 如何简化 std::variant 类类型

我确信有一种简单的方法可以做到这一点,但在 SO 中找不到任何东西。在en.cppreference.com中也找不到太多信息。

有没有办法简化,std::variant</*class types*/>以便我们可以声明可以将其std::variant作为参数的函数和类。

考虑这个例子:

我有一个向量作为以下容器的容器std::variant

如果我想将此向量作为参数传递给函数,我必须添加以下参数声明。

我也许可以在这个例子中使用,但这并不能真正解决问题。

std::variant有没有更好的解决方案,而不是在项目周围一遍又一遍地列出相同的类类型?

实时代码

0 投票
1 回答
151 浏览

c++ - 如何使映射键具有两种不同的数据类型?

我有一个std::unordered_map容器,其中Key可以有两种数据类型:

  • 64 位无符号整数
  • 具有(8 位无符号整数、8 位无符号整数、16 位无符号整数、32 位无符号整数)的元组

但是 value 是与两种键类型相同的对象类型。

我尝试过的一件事是制作密钥 astd::variant以便它可以容纳两种类型。根据一些条件检查,键被设置为以下类型之一:

此外,与此函数类似,我们在多个函数上执行 find() unordered_map

有没有办法修复 std::variant,或者我应该使用另一种方法?

0 投票
1 回答
455 浏览

c++ - 如何比较自定义类的 std::variant?

1.这是我的课:

2.我有以下typedef:

3. 我想写一个断言:

我该如何实施?

0 投票
1 回答
2592 浏览

c++ - 我应该使用什么来代替 void 作为变体中的替代类型之一?

我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型或什么都没有。好吧,很自然,我在考虑使用std::variant<Foo, Bar, void>- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,则会失败(GCC 8.2)。

那我用什么代替呢?某种空结构?

0 投票
3 回答
2708 浏览

c++ - 如何使用访问者从变体返回特定类型?

我有下面的代码,为什么visitor1visitor2给出错误?这是否意味着访问者不能在变体中返回一种类型?

我知道我可以使用std::get(),但问题是我只能使用autowith std::get(),如果我执行以下操作,x则在 if/else 范围之外无法访问:

0 投票
1 回答
245 浏览

c++17 - 使用 std::variant 的 StateMachine,获得正确的自定义模板推导

使用以下代码如何正确编写自定义模板推导?

我查看了几个示例,但找不到使用 std::visit 返回的示例。