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

c++ - 在构造 std::variant 时禁用从指针类型到 bool 的隐式转换的最佳方法是什么?

考虑以下:

正如评论中所讨论的,我相信以上是合法的 C++17。有一个提案P0608R3被接受为解决这种令人惊讶的行为的标准,但它在 2018 年(在圣地亚哥会议上)被接受,因此适用于 C++20 而不是 C++17。此外,P0608R3 当前未在 Visual Studio 中实现,即使编译为 C++20 预览版也是如此。

从指向非 foo 的指针创建此变体的最佳/最简洁的方法是编译时错误?我相信以下内容有效,但如果变体包含多个项目,则有很多样板。

我错过了一些更简单的方法吗?

0 投票
3 回答
732 浏览

c++ - 如何安全地复制具有 `std::variant` 成员的类?

以下示例在Container container2(container1);删除该行的情况下正确构建和运行。似乎std::variant删除了自身的复制构造函数,这使得 myContainer的复制构造函数被隐式删除。

实际上,我在问:

  1. std::variant将 a 存储为成员的正确方法是什么?
  2. Container在允许安全复制/移动分配之前必须实施什么?
0 投票
2 回答
212 浏览

c++ - 为什么 std::unique_ptr 没有优化而 std::variant 可以?

我试图比较(多态)和虚函数(多态)的开销std::visitstd::variantstd::unique_ptr请注意我的问题不是关于开销或性能,而是关于优化。)这是我的代码。 https://quick-bench.com/q/pJWzmPlLdpjS5BvrtMb5hUWaPf0

我知道这不是很好的基准测试,它只是我测试期间的草稿。但我对结果感到惊讶。 std::visit基准很高(这意味着慢),没有任何优化。但是当我打开优化(高于 O2)时,std::visit基准非常低(这意味着非常快),而std::unique_ptr不是。我想知道为什么不能将相同的优化应用于std::unique_ptr多态性?

0 投票
1 回答
107 浏览

c++ - g++ std::variant 似乎不支持带有 std::atomic/std::mutex 变量成员的用户类(带有详细信息/代码)

例如,如果我有一个带有 std::atomic_bool 或 std::mutex 成员的类,并且如果我将这个类放在 std::variant 中,我的 g++ 将抱怨“没有匹配函数调用 std::variant<.. ..>”。现在我必须声明我的 std::mutex 成员是静态的。

g++ (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5) 版权所有 (C) 2017 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。

实际代码

编译错误:

0 投票
0 回答
37 浏览

c++ - 在 C++ 中调用变体访问的“重载”技巧实际上是如何工作的?

我在 C++17 代码库中看到了类似以下的代码,并自己开始使用它:

并试图了解overloaded实际在做什么。在不使用可变参数模板的情况下,我相信上述内容可以扩展为:

我理解 的定义struct overloaded:它继承自两个 lambdas,这两个 lambdas 将通过 lambdasoperator()定义,并说将这些operator()s 用作 的函数调用运算符overloaded。但是,我什至不知道其他两行在C++ 的语义方面什么:它们似乎正在制作它,因此您可以struct overloaded从任意 lambda 或类似的东西构造一个。

0 投票
1 回答
51 浏览

c++ - 无序地图与地图

0 投票
2 回答
105 浏览

c++ - 覆盖 std::variant::operator==

将变体的替代类型放入子命名空间似乎会破坏operator==

我找到的唯一解决方案是定义:

但这看起来有点可疑,并且似乎被 c++20 禁止:https ://en.cppreference.com/w/cpp/language/extending_std#Function_templates_and_member_functions_of_templates

有更好的想法吗?显然,我试图避免operator==为每种替代类型添加。

0 投票
1 回答
407 浏览

python - 使用 pybind11 在 C++ 中将 Python 类表示为 std::variant 中的类型

下面的工作示例将由 float 和 int64_t 组成的变体类型向量返回给 Python。目的(由注释的代码行说明**)是通过启用用 C++ 构建的 Decimal(python 类)以相同的结构传递回 Python 来为此添加更多功能。

所以要解决这个问题,可以将 Decimal 表示为 std::variant 的一部分,以便可以将它与向量一起传递回 Python,还是解决方案不那么简单?

0 投票
2 回答
127 浏览

c++ - 定义一个函数以返回指定类型的 std::variant c++

我对使用 c++17 规则几乎是新手。我的问题很简单;如何以我定义它们的相同顺序访问 std::variant 类型?我知道下面的代码不起作用!

0 投票
1 回答
257 浏览

c++ - std::variant 在 MSVC 和 gcc 中的行为不同

更新:这是一个 C++ 标准缺陷,已在 C++20 (P0608R3) 中修复。此外,VS 2019 16.10 已使用/std:c++20.

MSVC 19.28 拒绝以下代码,但 gcc 10.2 接受它并输出true false

根据cppreference

  1. 转换构造函数。构造一个变体,如果同时在作用域内的每个from都存在虚函数的重载,则该变体T_j将通过重载决议为表达式选择,除了:仅当声明对某些有效时才考虑重载发明变量;直接初始化包含的值,就像通过直接非列表初始化从.F(std::forward<T>(t))F(T_i)T_iTypes...F(T_i)T_i x[] = { std::forward<T>(t) };xstd::forward<T>(t)

并且问题被转换为通过重载决议选择F(long long)F(double)选择的哪个函数。1

转换intlong long整数转换(假设sizeof(long long)大于sizeof(int)),转换intdouble浮点整数转换,两者的排名都不高于另一个。所以调用是模棱两可的,程序格式不正确。

MSVC 确实像我预期的那样拒绝了该代码,但令我惊讶的是,gcc 接受了它。此外,在cppreference上也有一个类似的例子:

所以我的问题是:是 gcc 或 MSVC 不符合,还是我的理解有误?