草庐IT

variant_t

全部标签

c++ - 有没有办法从已知的替代方案中重置 std::variant ?

我正在更新一个代码库,该代码库当前正在使用std::variant的自定义等效项到C++17。在代码的某些部分,变体正在从一个已知的替代中重置,因此该类提供了一个方法来断言index()处于当前值,但仍无条件直接调用适当的析构函数。这用于一些紧凑的内部循环,并且具有(测量的)非平凡的性能影响。这是因为它允许编译器在所讨论的替代方案是可简单破坏的类型时消除整个破坏。在我看来,目前的std::variant无法实现这一点。在STL中实现,但我希望我错了。有没有一种我没有看到的方法来完成这个,或者我不走运?编辑:根据要求,这是一个使用示例(使用@T.C的示例作为基础):structS{~S(

c++ - 有没有办法从已知的替代方案中重置 std::variant ?

我正在更新一个代码库,该代码库当前正在使用std::variant的自定义等效项到C++17。在代码的某些部分,变体正在从一个已知的替代中重置,因此该类提供了一个方法来断言index()处于当前值,但仍无条件直接调用适当的析构函数。这用于一些紧凑的内部循环,并且具有(测量的)非平凡的性能影响。这是因为它允许编译器在所讨论的替代方案是可简单破坏的类型时消除整个破坏。在我看来,目前的std::variant无法实现这一点。在STL中实现,但我希望我错了。有没有一种我没有看到的方法来完成这个,或者我不走运?编辑:根据要求,这是一个使用示例(使用@T.C的示例作为基础):structS{~S(

c++ - Boost Variant 本质上是 C/C++ 中的 union ?

我想知道c/c++中的BoostVariant和union数据类型之间有什么区别。我知道union数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用使用的内存总量,例如unionspace{charCHAR;floatFLOAT;intINTEGER;}S;应该占用4个字节的内存,因为int和float是最大且相等的大小。BoostVariant和union数据类型在其他方面是否有相同点和不同点?我也知道BoostVariant可以采用任何数据类型,并且它允许数据类型“多态性”(如果我误用了OOP主题词,请纠正我)。因此,union数据类型也是一种多态性吗?

c++ - Boost Variant 本质上是 C/C++ 中的 union ?

我想知道c/c++中的BoostVariant和union数据类型之间有什么区别。我知道union数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用使用的内存总量,例如unionspace{charCHAR;floatFLOAT;intINTEGER;}S;应该占用4个字节的内存,因为int和float是最大且相等的大小。BoostVariant和union数据类型在其他方面是否有相同点和不同点?我也知道BoostVariant可以采用任何数据类型,并且它允许数据类型“多态性”(如果我误用了OOP主题词,请纠正我)。因此,union数据类型也是一种多态性吗?

c++ - 为什么 boost::variant 不提供运算符 !=

给定两个相同的boost::variant实例a和b,允许使用表达式(a==b)。但是(a!=b)似乎未定义。这是为什么呢? 最佳答案 我认为它只是没有添加到库中。Boost.Operators并没有真正的帮助,因为任何一种变体都是从boost::operator::equality_comparable派生的。DavidPierre说你可以使用它是对的,但你的回答也是正确的,ADL找不到新的运算符!=,所以你需要一个using运算符。我会在boost-users邮件列表中问这个问题。编辑@AFoglia的评论:七个月后,我正在研究

c++ - 为什么 boost::variant 不提供运算符 !=

给定两个相同的boost::variant实例a和b,允许使用表达式(a==b)。但是(a!=b)似乎未定义。这是为什么呢? 最佳答案 我认为它只是没有添加到库中。Boost.Operators并没有真正的帮助,因为任何一种变体都是从boost::operator::equality_comparable派生的。DavidPierre说你可以使用它是对的,但你的回答也是正确的,ADL找不到新的运算符!=,所以你需要一个using运算符。我会在boost-users邮件列表中问这个问题。编辑@AFoglia的评论:七个月后,我正在研究

c++ - 为什么要为具有非平凡析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

据我了解(至少对于c++14而言),析构函数不能是constexpr如果它不是微不足道的(隐式生成或=default)。声明constexpr有什么意义?具有非平凡析构函数的结构的构造函数?structX{inta_;constexprX(inta):a_{a}{}//constexpr~X(){};//Errordtorcannotbemarkedconstexpr//~X(){};//causeserroratydeclaration:temporaryofnon-literaltype‘X’//inaconstantexpression.};templatestructY{};i

c++ - 为什么要为具有非平凡析构函数的类声明 constrexpr 构造函数(例如 unique_ptr、std::variant)

据我了解(至少对于c++14而言),析构函数不能是constexpr如果它不是微不足道的(隐式生成或=default)。声明constexpr有什么意义?具有非平凡析构函数的结构的构造函数?structX{inta_;constexprX(inta):a_{a}{}//constexpr~X(){};//Errordtorcannotbemarkedconstexpr//~X(){};//causeserroratydeclaration:temporaryofnon-literaltype‘X’//inaconstantexpression.};templatestructY{};i

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

以下代码是否会调用未定义的行为?std::variantv=...;std::visit([&v](auto&e){ifconstexpr(std::is_same_v,A>)e.some_modifying_operation_on_A();else{inti=e.some_accessor_of_B();v=some_function_returning_A(i);}},v);特别是,当变体不包含A时,此代码重新分配A,同时仍保留对先前持有的B类型对象的引用。但是,由于在分配后不再使用引用,我觉得代码很好。但是,标准库是否可以自由实现std::visit以某种方式使上述行为未定义?

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

以下代码是否会调用未定义的行为?std::variantv=...;std::visit([&v](auto&e){ifconstexpr(std::is_same_v,A>)e.some_modifying_operation_on_A();else{inti=e.some_accessor_of_B();v=some_function_returning_A(i);}},v);特别是,当变体不包含A时,此代码重新分配A,同时仍保留对先前持有的B类型对象的引用。但是,由于在分配后不再使用引用,我觉得代码很好。但是,标准库是否可以自由实现std::visit以某种方式使上述行为未定义?