7得票2回答
获取 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...

12得票3回答
std::get_if(std::variant)为什么要通过指针而不是值/&/const&获取变量参数,是否有实际的原因?

我从未使用过std::get_if,因为它的名称与std::get不同,所以我不明白为什么它的参数应该是一个指针¹(而std::get有一个按引用传递的参数)。 ¹如果它也被命名为std::get,那么函数重载将是足够的理由。 是的,我的问题可能与是否绝对需要std:: any_c...

10得票1回答
为什么std::variant的实现对于空类型的变量需要占用超过1个字节的空间?

这基本上是一道琐事题,因为我怀疑我永远不会需要节省这个空间。 在 godbolt 上玩耍时,我注意到 libstdc++ 和 libc++ 的实现都需要使用超过 1 字节来存储空结构体的 variant。 libstc++ 使用 2 字节 libc++ 使用 8 字节 我认为这只是没有必要优化...

10得票4回答
如何在使用C++ std::visit时改善编译器错误信息?

我正在使用C++17的std::visit()函数处理一个有许多选项的variant,但是每当我在visitor中忘记一个或多个选项时,编译器产生的错误消息非常难以理解。 例如:template<class... Ts> struct overloaded : Ts... { u...

14得票3回答
为什么std::variant不能与其中一个备选类型进行等于比较?

例如,将std::variant<T1, T2>与T1或T2进行等值比较应该非常有帮助。目前我们只能与相同的变体类型进行比较。

7得票1回答
为什么clang要处理这个简单的std::variant代码中的异常?

如果我们有这样的代码: #include <variant> int main(){ using V = std::variant<int, double>; V a = 5; V b = 5.6; a.swap(b); } h...

26得票4回答
如何编写类似于std::variant开关的代码?

我有一些var = std::variant<std::monostate, a, b, c>,其中a,b,c是某些类型。 在运行时,如何检查var包含的类型? 在官方文档中,我找到了这样的信息:如果var包含类型a,并且我写std::get<b>(var),将会抛出一...

12得票1回答
当使用libc++时,为什么sizeof(std::variant< char >)等于8而不是2(就像MSVC的STL和libstdc++一样)?

考虑这个编译器探索中的例子。 基本上,我们有这个代码片段:#include &lt;cstdint&gt; #include &lt;variant&gt; enum class Enum1 : std::uint8_t { A, B }; enum class Enum2 : std:...

15得票1回答
在MSVC和gcc中,std::variant的行为不同。

更新: 这是C++标准的缺陷,在C++20 (P0608R3)中已得到修复。此外,VS 2019 16.10通过使用/std:c++20修复了这个错误。 MSVC 19.28拒绝以下代码,但gcc 10.2接受它并输出true false #include &lt;iostream&gt;...

10得票4回答
std::bind用于绑定包含多个std::function类型的std::variant

我正在尝试使用回调函数,并希望通过std::bind注册多个具有不同签名(尽管它们都返回void)的函数。将std::bind的结果分配给std::variant会导致“转换为非标量类型”的错误。这是一个歧义错误吗?我能否向编译器提供更多信息? 删除std::bind(允许赋值)不是一种选择...