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

c++ - 在 C++ 中,如何制作一个可以包含相同变体向量的变体?

我试图制作一个 std::variant 可以包含相同变体的向量:

我正在重新定义 ScriptParameter。它认为这可能是因为模板参数无法前向声明?

有没有办法实现一个也可以包含相同类型变体数组的变体?

0 投票
1 回答
613 浏览

c++ - 为什么在使用 libc++ 时 sizeof( std::variant< char > ) == 8 而不是 2 (如 MSVC 的 STL 和 libstdc++)?

考虑Compiler explorer 上的这个例子

基本上,我们有这个代码片段:

如果我们用 GCC 的 libstdc++ 编译它(使用 clang 或 GCC),我们会得到预期的编译错误:

此外,与 MSVC 类似(如预期的那样):

但是,当使用带有 libc++ 的 clang 时,我收到此错误:

这表明sizeof( std::variant< char > ) == 8在使用 libc++ 时。我已经在 Linux 上确认了这一点(请参阅上面的编译器资源管理器链接),但也适用于 Android 的 NDK r18 和 Xcode 10(iOS 和 MacOS)。

libc++ 的实现是否有理由std::variant使用这么多内存,或者这只是 libc++ 中的一个错误,应该报告给 libc++ 开发人员?

0 投票
2 回答
2367 浏览

c++ - 获取当前持有的 std::variant 的 typeid(如 boost::variant type())

我已经从 boost::variant 迁移到 std::variant,但遇到了障碍。

我在 boost 'type()' 中使用了一个很好的函数,它可以让你获得当前持有的 typeid。见https://www.boost.org/doc/libs/1_48_0/doc/html/boost/variant.html#id1752388-bb

如何使用 std::variant 实现这一点?

我在“type_index”上有一个无序映射键,它包含一些值“std::function”。我的变体,取决于类型,将决定我从地图中抓取什么功能来做一些操作。(我的代码太大而无法发布)。

除了为特定的 std::variant 编写特定的访问者之外,还有什么实现想法吗?也许使用 std::variant 上的 'index()' 函数,然后索引到变体的类型列表中?有点像这样:如何从元组中获取第 N 个类型?

0 投票
1 回答
1136 浏览

c++ - 如何获得对变体值的引用?

我有std::variant所有类都派生自同一个基础的地方。我想将变体转换为基础。

这会编译但会发出警告 C4172:返回局部变量或临时地址

有没有办法std::variant就地访问,而无需制作本地或临时副本?

或者,如果不可能,我该如何将值转换为void*我可以使用static_cast

更新:我认为这个例子应该很明显,但事实并非如此,这是完整的再现:

0 投票
2 回答
373 浏览

c++ - C++2017 对 std::vector 的引用

我尝试存储对std::vector包含的引用std::variant。我可以const std::variant<T>&为 a 的元素创建 a vector,但我很难存储对整个向量的引用。我想答案与通过引用存储的这个帖子 c++ 变体类成员有关,但我无法将其应用于我的情况。

0 投票
1 回答
1498 浏览

c++ - 如何将 std::visit 与包含枚举的 std::variant 一起使用

我尝试使用带有枚举的 std::variant 作为可能类型的一部分。我有一个编译错误,我找不到原因。如果我使用任何其他类型而不是枚举,则代码有效。这是我的代码的一部分:

如果我取消注释该块,为什么此代码无法编译?

* 第一次编辑 *

我将代码修改为如下所示,现在它可以工作了。

0 投票
5 回答
1205 浏览

c++ - 传递给 std::variant 的预定义类型列表

有没有办法创建一个预定义的类型列表,并在 c++ 17 的 std::variant 中使用这些类型?这是我正在尝试做的事情,它可以编译,但不能像我希望的那样工作:

0 投票
1 回答
1330 浏览

c++ - 我可以在对 std::visit 的调用中更改 std::variant 中的保留类型吗

以下代码是否调用未定义的行为?

特别是,当变体不包含 时A,此代码重新分配一个Awhile 仍然持有对先前持有的类型对象的引用B。但是,由于赋值后不再使用引用,所以我觉得代码很好。但是,标准库是否可以自由地以std::visit 上述未定义行为的方式实现?

0 投票
3 回答
3248 浏览

c++ - 为什么不允许 std::variant 与其一种替代类型进行相等比较?

例如,将 astd::variant<T1, T2>与 a进行相等比较应该是非常有帮助的T1or T2。到目前为止,我们只能与相同的变体类型进行比较。

0 投票
2 回答
490 浏览

c++ - 使用 std::enable_if 重载函数以避免模板替换错误

我想编写两个模板函数,一个捕获特定案例,另一个捕获与第一个案例不匹配的所有其他案例。我正在尝试使用 std::enable_if 来捕捉特定情况,但编译器仍然失败,匹配不明确。如何编写这些重载函数以便编译器解决歧义?(我正在使用 g++)

我尝试编写以下代码(这是重现问题的简化示例):

我希望编译器将所有情况std::is_same_v<U::resource_t,R>与特定情况以及所有其他组合与一般情况相匹配,相反,编译器无法说明该函数不明确。我也尝试! std::is_same了第二个定义,编译器失败了error: redefinition of ... callCalcValue()...