草庐IT

UNION-ed

全部标签

c++ - 在 union 成员初始化器列表中初始化多个重叠字段是否合法?

我有这个联盟:unionFoo{uint32_tu32;struct{uint32_ta:10;uint32_tb:10;uint32_tc:10;uint32_td:2;};Foo():a(0),b(1),c(2),d(3){}};我们有一个分析C++代码潜在错误的工具,它有一个误报,它认为在我写这篇文章时u32还没有被初始化。我发现VC++会让我写这个成员初始化列表:Foo():u32(0),a(0),b(1),c(2),d(3)它确实关闭了该工具,但它看起来……非常可疑。(根据评论编辑:GCC和Clang不会接受它,所以非常可疑似乎是有道理的。)对于结构,成员初始值设定项按其在结

C++(以某种方式)将结构限制为父 union 大小

我正在尝试创建一个可变大小的颜色类-给定一个模板确定的值数组,我想为数组中的每个值创建命名别名,即:templateclassColor{public:union{Tv[C];struct{Tr,g,b,a;};};};但是,如果我尝试对C=3使用相同的类,union要求大小为4个字节(“a”成员)。或者,使用a的数学表达的位域大小(名为a的结构,匿名T成员,大小在C>3时计算为1),编译器发出一个许可警告(不可抑制,根据Ingcc,howtomutethe-fpermissivewarning?),这是不适合的更大规模的API。我将如何允许单个类处理不同数量的变量,同时保留每个变量的

c++ - enable_if'ed 模板化模板构造函数的类型签名?

我通常先声明我的类和模板,然后再定义它们的方法(当然是在同一个头文件中)。我只是觉得这样更容易阅读。好吧,我遇到过这样一种情况,我无法找出在类外定义中使用的有效类型签名。这是我正在做的一个简化示例,它说明了问题:templatestructFoo{Foo(Ta,Tb);template>>Foo(Iteratorfirst,Iteratorlast);};templateFoo::Foo(Ta,Tb){...}templatetemplateFoo::Foo(Uf,Ul){...}我在WHAT_GOES_HERE槽中尝试了很多方法来尝试获得匹配的签名,但我一直失败。我需要enable_

c++ - 在 union 中获取 sizeof 匿名结构

我希望这不是一个重复的问题,但我已经进行了一些详细搜索,但之前没有找到我的确切案例。我有一个简单的结构,我也希望能够将其作为简单的字节数组进行访问union{struct{unsignedchara;unsignedcharb;//...Someothermembers...unsignedcharw;};unsignedcharbytes[sizeof(what?)];}myUnion;请注意,该结构没有命名,也没有给它自己的成员名称。这样我就可以使用myUnion.a访问该成员,而不是myUnion.myStruct.a。但是,如果没有一些名称,除了每次更改内容时手动计算之外,我如

c++ - 是否尝试修改 const_cast-ed,但动态分配的常量对象仍然是未定义的行为?

这个问题在这里已经有了答案:Canaheap-allocatedobjectbeconstinC++?(6个答案)关闭7年前。例如:constint*pc=newconstint(3);//notetheconstint*p=const_cast(pc);*p=4;//undefinedbehavior?特别是,编译器能否优化掉分配给堆的*pc?如果不是,尝试通过p修改*pc是否仍然构成未定义的行为-如果是,为什么?

c++ - set_union 与 multiset 容器?

当一个或两个输入容器是具有重复对象的多重集时,算法std:set_union的返回值是多少?dups会迷路吗?让我们假设例如:multisetms1;ms1.insert(1);ms1.insert(1);ms1.insert(1);ms1.insert(2);ms1.insert(3);multisetms2;ms2.insert(1);ms2.insert(1);ms2.insert(2);ms2.insert(2);ms2.insert(4);vectorv(10);set_union(ms1.begin(),ms1.end(),ms2.begin(),ms2.end(),v.b

c++ - 检查 union 实例之间相等性的正确方法是什么?

我有一个多线程应用程序,它将数据存储为以下union的实例数组unionunMember{floatfData;unsignedintuiData;};存储此数组的对象知道union中的数据是什么类型,因此在检索正确类型时我不会遇到UB问题。然而,在程序的其他部分,我需要测试这些union的两个实例之间的相等性,并且在这部分代码中,真正的内部数据类型是未知的。这样做的结果是我无法使用这种方法测试union的相等性unMemberun1;unMemberun2;if(un1==un2){//dostuff}当我遇到编译器错误时。因此,我只是比较union的float部分if(un1.fD

c++ - 在 C++11 中构建 union 元组

元组是一种likestructs.是否也有表现得像union的元组?或者我可以在元组中访问成员的union,例如my_union_tupleu;get(u);get(u);//C++14only,orseebelow对于第二行,请参阅here.当然,该解决方案不仅适用于特定的union,例如,但对于任意类型和类型数量。 最佳答案 没有std::tuple表示A和B。如果您想要一个类型安全的类union容器,请查看boostvariant.boost::variantv;v="hello";std::cout它确实为游客提供了安全的交

c++ - 在 C++ 中多次使用相同类型标记 union (也称为变体)

我需要创建一个union体,但union体的2个成员具有相同的类型,因此我需要一种方法来识别它们。例如在OCaml中:typeA=|Bofint|Coffloat|DoffloatBoost.Variant似乎不支持这种情况,是否有已知的库支持这种情况? 最佳答案 如果你想这样做,我认为你最好的选择是将相同但不同的类型包装到一个结构中,然后让boost变体访问正确的类型:structSpeed{floatval_;};structDarkness{floatval_;};您可能能够使用BOOST_STRONG_TYPEDEF自动执行

c++ - 在 Clang 中判断访问的 CXXRecordDecl 是类、结构还是 union

我使用Clang从C++源代码构建AST,并使用RecursiveASTVisitor遍历树。我想在记录的访问声明中决定它是类、结构还是union。我有一个覆盖函数VisitCXXRecordDecl(clang::CXXRecordDecl)。在这个函数中我可以checkanyinformationaboutCXXRecordDecl该类(class)提供的信息,但我不知道如何获取这些信息。谁能帮帮我? 最佳答案 只需使用isStruct,isClass,和isUn​​ion成员函数,或者调用getTagKind得到一个TagKi