草庐IT

UNION-ed

全部标签

c++ - 从基类访问 union 的公共(public)部分

我有一个Result包含一些union的模板类error_type和T.我想在不求助于虚函数的情况下公开基类中的公共(public)部分(错误)。这是我的尝试:usingerror_type=std::exception_ptr;structResultBase{error_typeerror()const{return*reinterpret_cast(this);}protected:ResultBase(){}};templatestructResult:ResultBase{Result(){new(&mError)error_type();}~Result(){mError.

c++ - O(log n) 算法在预排序列表的 union 中查找具有等级 i 的元素

给定两个排序列表,每个列表包含n个实数,是否存在O(logn)时间算法来计算两个列表的union中排名i(其中i对应于递增顺序的索引)的元素,假设两个列表的元素不同?编辑:@BEN:这就是我一直在做的,但我还是不明白。我有一个例子;列表A:1、3、5、7列表B:2,4,6,8找到rank(i)=4。第一步:i/2=2;列表A现在包含的是A:1、3列表B现在包含的是B:2,4compareA[i]toB[i]i.eA[i]isless;Sothelistsnowbecome:A:3B:2,4第二步:i/2=1ListAnowcontainsA:3ListBnowcontainsB:2No

c++ - 如何在类初始值设定项中设置 union ?

给定一个类(如下所示)和给定的union,如何将union初始化为正确的值?这里尝试的是使用两种或多种不同的类型作为类的核心数据类型之一。假设类型是提前已知的,而不是使用void*,将构造将要使用的类型的union。问题是如何在实例化类时初始化正确的union成员。这些类型不是多态的,因此通常的继承模型似乎并不合适。一些天真的尝试初始化正确的union成员没有结果。unionUnion{intn;char*sz;};classClass{public:Class(intn):d(1.0),u(n){}Class(char*sz):d(2.0),u(sz){}....doubled;Un

c++ - 实现标记 union 的移动构造函数

我使用包含匿名union和标记的类实现了标记union:classLogFile{public:LogFile(std::ostream&stdStream);LogFile(std::ofstreamfileStream);LogFile(LogFile&&logFile);~LogFile();std::ostream&getStream();private:enum{STD_STREAM,FILE_STREAM}streamType_;union{std::ostream*stdStream_;std::ofstreamfileStream_;};};我在实现移动构造函数时遇到了

c++ - 根据模板参数选择 union 成员

我正在处理C++中的union,我想要一个函数模板,它可以根据模板参数访问活跃的union成员。代码是这样的(doSomething只是一个例子):unionUnion{int16_ti16;int32_ti32;};enumclassActiveMember{I16,I32}templatevoiddoSomething(Uniona,constUnionb){selectMemeber(a,M)=selectMember(b,M);//thiswouldbeexactly(notequivalent)thesame//thata.X=b.XdependingonT.}为了实现这一点

c++ - 如何为类 union 类编写析构函数

我正在尝试使用具有一些非原始变量的union(C++),但我一直在尝试为该类创建析构函数。正如我所读到的,不可能猜测正在使用union的哪个变量,因此没有隐式析构函数,并且当我在堆栈上使用这个union时,编译器会错误地指出析构函数已被删除。union体如下:structLuaVariant{LuaVariant():type(VARIANT_NONE){}LuaVariantType_ttype;union{std::stringtext;Positionpos;uint32_tnumber;};};type变量保存正在使用union体的哪个字段(从枚举中选择),目的是从union体

c++ - 包含“类型”成员的 union

我有一个关于union的问题,我仍然不了解。我已经阅读了很多关于它们的用途,并且在大多数情况下可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“C风格”多态性。我在几个网站上看到的例子是SDL的事件union:typedefunion{ Uint8type; SDL_ActiveEventactive; SDL_KeyboardEventkey; SDL_MouseMotionEventmotion; SDL_MouseButtonEventbutton; SDL_JoyAxisEventjaxis; SDL_JoyBallEventjball; SDL_JoyHatEve

c++ - Ada Variant Record 能否与 C++ union 二进制兼容?

我正在设计一个通信中间件,用于一个应用程序,该应用程序有一个Ada模块和许多C++模块,用于传递传递的参数(标量值)和结构。该应用程序在MSWindowsXP和Windows7中运行,C++部分在MSVC++2008中开发,Ada部分使用GPS/GNAT开发。Ada版本是1995,但我们正在进行编译器迁移(更新版本的GPS/GNAT),有可能使用更新的Ada规范。中间件是用C++编写的,我想使用包含在模块之间传递的所有类型的union类型,这样我就不需要为系统上使用的每种类型指定一个put/get函数。问题是,C++union是否与Ada变体记录二进制兼容?换句话说,如果我将C++un

c++ - 在 C++ 中,为什么仅包含 union 及其基类实例的派生类占用的内存大于 union 的大小?

更具体地说,一个类继承自一个空类,只包含一个union体,其成员包括基本无数据类的实例,比union体占用更多的内存。为什么会发生这种情况,是否有任何方法可以避免消耗额外的内存?下面的代码说明了我的问题:#includeclassempty_class{};structbig:publicempty_class{union{intdata[3];empty_classa;};};structsmall{union{intdata[3];empty_classa;};};intmain(){std::cout此代码的输出,当使用gcc版本7.3.0编译时使用-std=c++17编译(虽然

c++ - 这段代码是做什么的 : static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};

#ifndefINFINITY#ifdef_MSC_VERunionMSVC_EVIL_FLOAT_HACK{unsigned__int8Bytes[4];floatValue;};staticunionMSVC_EVIL_FLOAT_HACKINFINITY_HACK={{0x00,0x00,0x80,0x7F}};#defineINFINITY(INFINITY_HACK.Value)#endif我目前正在开始使用Chipmunk物理引擎并在头文件中找到它INFINITY用于为物体设置无限动量,但是我不明白上面这段代码的作用! 最佳答案