我一直在寻找,但似乎编译器开发人员对支持这些的兴趣为零。对我来说,这似乎很奇怪——基本上,当前的C++对union有一些限制,这些限制总是令人恼火而且从不合适。您可能认为基本上删除一些错误检查是勾选额外的c++0x支持框的一种相对简单的方法,但AFAICT还没有编译器开发人员这样做。我之所以感兴趣是因为它为数据结构编码中反复出现的问题提供了一个简单的解决方案——如何为一些未知(模板参数)类型的实例保留内存,最好在情况下,但不调用恰好在该类型上定义的任何构造函数。真正重要的一点是必须遵守对齐规则。不受限制的union非常适合此-它为您提供了一个没有构造函数或析构函数的类型,但具有允许任何
我想根据参数选择在构造函数中初始化的union成员。以下是一个有效的示例:structA{union{inti;floatf;};A(doubled,boolisint){if(isint)new(&i)int(d);elsenew(&f)float(d);}};当我使用int和float时,目标是使用其他更复杂的类型(但在C++14union中仍然允许),因此使用placement-new(而不是分配)。问题是这个构造函数不能是constexpr因为在constexpr方法中不允许放置新的。有没有办法解决这个问题(除了使isint参数成为正式类型系统的一部分)?某种类型的条件初始化器
我有一个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.
给定两个排序列表,每个列表包含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
给定一个类(如下所示)和给定的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
我使用包含匿名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,我想要一个函数模板,它可以根据模板参数访问活跃的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.}为了实现这一点
我正在尝试使用具有一些非原始变量的union(C++),但我一直在尝试为该类创建析构函数。正如我所读到的,不可能猜测正在使用union的哪个变量,因此没有隐式析构函数,并且当我在堆栈上使用这个union时,编译器会错误地指出析构函数已被删除。union体如下:structLuaVariant{LuaVariant():type(VARIANT_NONE){}LuaVariantType_ttype;union{std::stringtext;Positionpos;uint32_tnumber;};};type变量保存正在使用union体的哪个字段(从枚举中选择),目的是从union体
我有一个关于union的问题,我仍然不了解。我已经阅读了很多关于它们的用途,并且在大多数情况下可以看到它们如何有用并理解它们。我已经看到它们可以提供原始的“C风格”多态性。我在几个网站上看到的例子是SDL的事件union:typedefunion{ Uint8type; SDL_ActiveEventactive; SDL_KeyboardEventkey; SDL_MouseMotionEventmotion; SDL_MouseButtonEventbutton; SDL_JoyAxisEventjaxis; SDL_JoyBallEventjball; SDL_JoyHatEve
我正在设计一个通信中间件,用于一个应用程序,该应用程序有一个Ada模块和许多C++模块,用于传递传递的参数(标量值)和结构。该应用程序在MSWindowsXP和Windows7中运行,C++部分在MSVC++2008中开发,Ada部分使用GPS/GNAT开发。Ada版本是1995,但我们正在进行编译器迁移(更新版本的GPS/GNAT),有可能使用更新的Ada规范。中间件是用C++编写的,我想使用包含在模块之间传递的所有类型的union类型,这样我就不需要为系统上使用的每种类型指定一个put/get函数。问题是,C++union是否与Ada变体记录二进制兼容?换句话说,如果我将C++un