草庐IT

c++ - 为什么我的变体将 std::string 转换为 bool?

我的std::variant可以为空(std::monostate),包含一个int,一个std::字符串或bool。当我想用var="thisismystring"给出的字符串来输入它时,它会被转换为bool而不是字符串。如果我明确声明类型,它会工作var=std::string("thisismystring")。为什么会这样?有什么办法可以避免吗?#include#include#includeintmain(){usingvar=std::variant;varcontains_nothing;varcontains_int=5;varcontains_string="hell

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++ - 无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能

我最近将gcc和g++更新到了7.2版。我想特别尝试std::experimental::any和std::variant,我在QtCreator中使用Qt5.9.1。到目前为止,我已经在项目文件中写了这个:CONFIG+=c++17我已经在正确的地方添加了正确的标题:#include#include任何工作都很好,没有问题。但是,当我包含变体头文件时,我收到此错误:/usr/include/c++/7/bits/c++17_warning.h:32:error:#errorThisfilerequirescompilerandlibrarysupportfortheISOC++201

c++ - 无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能

我最近将gcc和g++更新到了7.2版。我想特别尝试std::experimental::any和std::variant,我在QtCreator中使用Qt5.9.1。到目前为止,我已经在项目文件中写了这个:CONFIG+=c++17我已经在正确的地方添加了正确的标题:#include#include任何工作都很好,没有问题。但是,当我包含变体头文件时,我收到此错误:/usr/include/c++/7/bits/c++17_warning.h:32:error:#errorThisfilerequirescompilerandlibrarysupportfortheISOC++201

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