ZBLOG

14.2.2.10. Union Types Union types are a special type of structure type where only one member exists. The TypeKind used to identify unions is TK_UNION. Member selection is performed by setting another special member called discriminator. The disc...

14.2.2.10. 联合类型(Union Types)

联合类型是一种特殊的结构类型,其中只能有一个成员。用于识别联合的 TypeKindTK_UNION。成员选择是通过设置一个特殊的成员称为 discriminator 来完成的。判别器(discriminator)类型必须使用 TypeDescriptordiscriminator_type 属性定义。支持的判别器 TypeKind 包括以下几种:

  • TK_BOOLEAN
  • TK_BYTE
  • TK_CHAR8
  • TK_CHAR16
  • TK_INT8
  • TK_UINT8
  • TK_INT16
  • TK_UINT16
  • TK_INT32
  • TK_UINT32
  • TK_INT64
  • TK_UINT64
  • TK_ENUM
  • 解析到上述某种类型之一的TK_ALIAS

联合的可扩展性可以使用 TypeDescriptorextensibility_kind 属性进行配置。

注意: 当前不支持 @nested 内置注释。

联合成员必须使用 DynamicTypeBuilder 配置,调用 DynamicTypeBuilder::add_member 函数,并使用相应的 MemberDescriptor。至少必须向联合类型添加一个成员。成员名称通过 MemberDescriptorname 属性配置,而成员类型则通过 type 属性设置。同时,必须设置 MemberDescriptoris_default_label 属性或配置标签属性。这最新属性指示选择此特定成员的判别值。如果未配置任何标签,则必须将标志设置为默认成员。只有一个联合成员可以被配置为默认。

此外,可以通过设置 MemberDescriptor.default_value 属性来配置成员默认值,而通过设置 MemberDescriptor.id 属性明确指定成员 ID。这种行为与设置 @default 和 @id 内置注释相同。

注意:

  • 当前,Fast DDS-Gen 不支持 @default 内置注释。
  • 当前,动态语言绑定 API 实现不支持以下内置注释:
    • @optional
    • @must_understand
    • @external
    • @try_construct

可以使用对应于底层成员类型的访问器管理成员数据。设置一个成员会自动更改选定该集合的判别值。当读取某个成员时,判别器必须选择正在读取的该特定成员。可以使用 DynamicData::get_member_id_by_name API 检索到某个会员 ID。有关管理复杂类型数据的信息,请参阅管理复杂数据类型部分。

示例代码解释

// IDLXMLC++
union InnerUnion switch (short)
{
    case 0:
        @id(0x10) PrimitivesStruct first;
    case 1:
    default:
        long long second;
};

union ComplexUnion switch (long)
{
    case 0:
    case 1:
        long third;
    default:
        InnerUnion fourth;
};
  1. InnerUnion:

    • 定义了一个名为 InnerUnion 的联合,其选择由一个短整型 (short) 判别器决定。在这个联合中:
      • 当判别器为 0 时,它包含一个名为 first 的字段,该字段是另一种结构 **PrimitivesStruct 类型,并具有ID 注释 (@id(0x10))。
      • 当判别器为 1 或者 默认情况下 (default),它包含一个长整型 (long long) 类型的数据字段称为 second
  2. ComplexUnion:

    • 接下来定义了另一个名为 ComplexUnion 的联合,其选择由长整型 (long) 判别器决定。在这个联合中:
      • 当判别器为 **0 或者 1 时,它包含一个长整型 (long) 字段称为 third
      • 在其他情况下 (default),它包含之前定义的 **InnerUnion 类型的新字段叫做 fourth,这表示在这些条件下,可以根据不同情况存储不同的数据,但每次只存储其中一种。

总之,通过这种方式创建和管理联盟,使得在处理复杂数据时能够更加灵活,同时确保在任何时候,只能有一项有效的数据,从而节省空间并简化逻辑处理。这种设计允许程序员以最小化开销来表示和操作多态性的信息结构。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=7499

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?