问题标签 [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 时禁用从指针类型到 bool 的隐式转换的最佳方法是什么?
考虑以下:
正如评论中所讨论的,我相信以上是合法的 C++17。有一个提案P0608R3被接受为解决这种令人惊讶的行为的标准,但它在 2018 年(在圣地亚哥会议上)被接受,因此适用于 C++20 而不是 C++17。此外,P0608R3 当前未在 Visual Studio 中实现,即使编译为 C++20 预览版也是如此。
从指向非 foo 的指针创建此变体的最佳/最简洁的方法是编译时错误?我相信以下内容有效,但如果变体包含多个项目,则有很多样板。
我错过了一些更简单的方法吗?
c++ - 如何安全地复制具有 `std::variant` 成员的类?
以下示例在Container container2(container1);
删除该行的情况下正确构建和运行。似乎std::variant
删除了自身的复制构造函数,这使得 myContainer
的复制构造函数被隐式删除。
实际上,我在问:
std::variant
将 a 存储为成员的正确方法是什么?Container
在允许安全复制/移动分配之前必须实施什么?
c++ - 为什么 std::unique_ptr 没有优化而 std::variant 可以?
我试图比较(多态)和虚函数(多态)的开销std::visit
。std::variant
(std::unique_ptr
请注意我的问题不是关于开销或性能,而是关于优化。)这是我的代码。
https://quick-bench.com/q/pJWzmPlLdpjS5BvrtMb5hUWaPf0
我知道这不是很好的基准测试,它只是我测试期间的草稿。但我对结果感到惊讶。
std::visit
基准很高(这意味着慢),没有任何优化。但是当我打开优化(高于 O2)时,std::visit
基准非常低(这意味着非常快),而std::unique_ptr
不是。我想知道为什么不能将相同的优化应用于std::unique_ptr
多态性?
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. 这是免费软件;查看复制条件的来源。没有保修;甚至不考虑适销性或特定用途的适用性。
实际代码
编译错误:
c++ - 在 C++ 中调用变体访问的“重载”技巧实际上是如何工作的?
我在 C++17 代码库中看到了类似以下的代码,并自己开始使用它:
并试图了解overloaded
实际在做什么。在不使用可变参数模板的情况下,我相信上述内容可以扩展为:
我理解 的定义struct overloaded
:它继承自两个 lambdas,这两个 lambdas 将通过 lambdasoperator()
定义,并说将这些operator()
s 用作 的函数调用运算符overloaded
。但是,我什至不知道其他两行在C++ 的语义方面是什么:它们似乎正在制作它,因此您可以struct overloaded
从任意 lambda 或类似的东西构造一个。
c++ - 覆盖 std::variant::operator==
将变体的替代类型放入子命名空间似乎会破坏operator==
:
我找到的唯一解决方案是定义:
但这看起来有点可疑,并且似乎被 c++20 禁止:https ://en.cppreference.com/w/cpp/language/extending_std#Function_templates_and_member_functions_of_templates
有更好的想法吗?显然,我试图避免operator==
为每种替代类型添加。
python - 使用 pybind11 在 C++ 中将 Python 类表示为 std::variant 中的类型
下面的工作示例将由 float 和 int64_t 组成的变体类型向量返回给 Python。目的(由注释的代码行说明**)是通过启用用 C++ 构建的 Decimal(python 类)以相同的结构传递回 Python 来为此添加更多功能。
所以要解决这个问题,可以将 Decimal 表示为 std::variant 的一部分,以便可以将它与向量一起传递回 Python,还是解决方案不那么简单?
c++ - 定义一个函数以返回指定类型的 std::variant c++
我对使用 c++17 规则几乎是新手。我的问题很简单;如何以我定义它们的相同顺序访问 std::variant 类型?我知道下面的代码不起作用!
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:
- 转换构造函数。构造一个变体,如果同时在作用域内的每个from都存在虚函数的重载,则该变体
T_j
将通过重载决议为表达式选择,除了:仅当声明对某些有效时才考虑重载发明变量;直接初始化包含的值,就像通过直接非列表初始化从.F(std::forward<T>(t))
F(T_i)
T_i
Types...
F(T_i)
T_i x[] = { std::forward<T>(t) };
x
std::forward<T>(t)
并且问题被转换为通过重载决议选择F(long long)
和F(double)
选择的哪个函数。1
转换int
为long long
整数转换(假设sizeof(long long)
大于sizeof(int)
),转换int
为double
浮点整数转换,两者的排名都不高于另一个。所以调用是模棱两可的,程序格式不正确。
MSVC 确实像我预期的那样拒绝了该代码,但令我惊讶的是,gcc 接受了它。此外,在cppreference上也有一个类似的例子:
所以我的问题是:是 gcc 或 MSVC 不符合,还是我的理解有误?