93得票4回答
`std::variant` 与继承以及其他方式的比较(性能)

我想了解std :: variant的性能。 什么情况下不应使用它? 使用std :: visit似乎比虚拟函数更好,这让我感到惊讶!在《C ++之旅》中,Bjarne Stroustrup在解释std :: holds_alternatives和overloaded方法后,对pattern ...

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

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

25得票2回答
为什么我的结构体在使用 `std::variant` 和 `std::monostate` 时被析构了两次?

我正在尝试学习std::variant。在这个例子中,我不理解为什么我不想初始化ab,而是使用std::monostate,类A只被构造一次,但却被析构两次。发生了什么? #include <iostream> #include <variant> struct A...

24得票1回答
我可以在调用std::visit时更改std::variant中的持有类型吗?

以下代码是否会调用未定义行为?std::variant<A,B> v = ...; std::visit([&v](auto& e){ if constexpr (std::is_same_v<std::remove_reference_t<dec...

20得票3回答
按给定条件拆分给定的std::variant类型

如何购买给定的变体类型using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>; 声明两种变量类型using V1 = std::variant<bo...

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 <iostream>...

14得票3回答
std::optional如何避免“因异常而无值”?

std::variant可以进入一种称为“valueless by exception”的状态。 据我所知,这种情况的常见原因是移动赋值引发异常。变体(variant)的旧值不再保证存在,预期的新值也不再存在。 std::optional则没有这种状态。cppreference对此做出了大胆声...

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

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

14得票3回答
在C++中,如何创建一个变量,它可以包含同一变量类型的向量?

我正在尝试创建一个能够包含相同变量类型的向量的std::variant:class ScriptParameter; using ScriptParameter = std::variant<bool, int, double, std::string, std::vector<S...

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

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