问题标签 [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.
c++ - 使用 std::variant> 作为灵活的输入而不是子类化
我有一个接受输入的类,有时我想通过分配一个变量来设置该输入,而在其他时候我希望该类调用一个函数来获取它的输入。
过去,我只是使用 astd::function<T()>
作为输入,并设置一个 lambda 来返回某个外部变量的值,但我正试图摆脱过度使用std::function
. 所以我想出了std::variant<T, std::function<T()>>
:
如此实现:
并因此灵活使用:
这是对仅使用 astd::function<T()>
作为输入和使用foo = []{return 42;}
固定输入值的改进吗?
另一种方法是为分配的输入和调用的输入创建单独的子类,但是当有多个输入时会导致组合爆炸。我还有其他选择吗?
c++ - boost::polycollection、std::variant 还是 CRTP?
假设“标准”C++ 继承范式:
我想要一个对迭代最有效的实现,即最小化间接引用,最大化内联优化等。为了限制问题,我事先知道我想要实现的每个特定“类型”(我可以只定义我需要的“func”类型,而不必允许其他可能性)。
出现几个可用的选项:
boost::polycollection
标准::变体
或 CRTP(Curiously Recurring Template Pattern)
让我知道正确的命名法,但在这里我根据“类型”“向上转换”基类——一种手动调度。
我可以为了便于开发而牺牲边际效率,但是在这种情况下是否对“最佳实践”达成共识?
EDITS* 修正了一些错别字;我目前的开发是CRTP的“开发中”最后一个选项。
解决方案:
经过测试, boost::polycollection 和 std::variant 都是有效的方法。然而,事实证明这是最有效的(根据记忆,可能略有偏差)。
c++ - std::variant 的 std::vector 的内存布局如何?
我在堆栈中分配了一种类型std::vector
。std::variant
由于每个变体的大小都是可变的。我想知道向量的内存布局在堆栈中是什么。
c++ - 为什么`std:variant`的`operator=(T&& t)`的noexcept规范不依赖于内部类型的析构函数的noexcept规范?
长标题:为什么std:variant
'soperator=(T&& t)
的 noexcept 规范不依赖于内部类型的析构函数的 noexcept 规范?
我可以在cppreference上看到
是
所以编译:
但它调用FooThrow
的析构函数是noexcept(false)
:
好像不太对。我错过了什么吗?
c++ - 如何简化 std::variant 类类型
我确信有一种简单的方法可以做到这一点,但在 SO 中找不到任何东西。在en.cppreference.com中也找不到太多信息。
有没有办法简化,std::variant</*class types*/>
以便我们可以声明可以将其std::variant
作为参数的函数和类。
考虑这个例子:
我有一个向量作为以下容器的容器std::variant
;
如果我想将此向量作为参数传递给函数,我必须添加以下参数声明。
我也许可以在这个例子中使用宏,但这并不能真正解决问题。
std::variant
有没有更好的解决方案,而不是在项目周围一遍又一遍地列出相同的类类型?
c++ - 如何使映射键具有两种不同的数据类型?
我有一个std::unordered_map
容器,其中Key
可以有两种数据类型:
- 64 位无符号整数
- 具有(8 位无符号整数、8 位无符号整数、16 位无符号整数、32 位无符号整数)的元组
但是 value 是与两种键类型相同的对象类型。
我尝试过的一件事是制作密钥 astd::variant
以便它可以容纳两种类型。根据一些条件检查,键被设置为以下类型之一:
此外,与此函数类似,我们在多个函数上执行 find() unordered_map
。
有没有办法修复 std::variant,或者我应该使用另一种方法?
c++ - 如何比较自定义类的 std::variant?
1.这是我的课:
2.我有以下typedef:
3. 我想写一个断言:
我该如何实施?
c++ - 我应该使用什么来代替 void 作为变体中的替代类型之一?
我想要一个变体,它可能包含 Foo 类型、(不相交的)Bar 类型或什么都没有。好吧,很自然,我在考虑使用std::variant<Foo, Bar, void>
- 但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,则会失败(GCC 8.2)。
那我用什么代替呢?某种空结构?
c++ - 如何使用访问者从变体返回特定类型?
我有下面的代码,为什么visitor1
并visitor2
给出错误?这是否意味着访问者不能在变体中返回一种类型?
我知道我可以使用std::get()
,但问题是我只能使用auto
with std::get()
,如果我执行以下操作,x
则在 if/else 范围之外无法访问:
c++17 - 使用 std::variant 的 StateMachine,获得正确的自定义模板推导
使用以下代码如何正确编写自定义模板推导?
我查看了几个示例,但找不到使用 std::visit 返回的示例。