14.2.2.10. 联合类型(Union Types)
联合类型是一种特殊的结构类型,其中只能有一个成员。用于识别联合的 TypeKind
是 TK_UNION。成员选择是通过设置一个特殊的成员称为 discriminator 来完成的。判别器(discriminator)类型必须使用 TypeDescriptor
的 discriminator_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
联合的可扩展性可以使用 TypeDescriptor
的 extensibility_kind
属性进行配置。
注意: 当前不支持 @nested 内置注释。
联合成员必须使用 DynamicTypeBuilder
配置,调用 DynamicTypeBuilder::add_member
函数,并使用相应的 MemberDescriptor
。至少必须向联合类型添加一个成员。成员名称通过 MemberDescriptor
的 name
属性配置,而成员类型则通过 type
属性设置。同时,必须设置 MemberDescriptor
的 is_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;
};
InnerUnion:
- 定义了一个名为 InnerUnion 的联合,其选择由一个短整型 (
short
) 判别器决定。在这个联合中:- 当判别器为 0 时,它包含一个名为 first 的字段,该字段是另一种结构 **PrimitivesStruct 类型,并具有ID 注释 (
@id(0x10)
)。 - 当判别器为 1 或者 默认情况下 (default),它包含一个长整型 (
long long
) 类型的数据字段称为 second。
- 当判别器为 0 时,它包含一个名为 first 的字段,该字段是另一种结构 **PrimitivesStruct 类型,并具有ID 注释 (
- 定义了一个名为 InnerUnion 的联合,其选择由一个短整型 (
ComplexUnion:
- 接下来定义了另一个名为 ComplexUnion 的联合,其选择由长整型 (
long
) 判别器决定。在这个联合中:- 当判别器为 **0 或者 1 时,它包含一个长整型 (
long
) 字段称为 third。 - 在其他情况下 (default),它包含之前定义的 **InnerUnion 类型的新字段叫做 fourth,这表示在这些条件下,可以根据不同情况存储不同的数据,但每次只存储其中一种。
- 当判别器为 **0 或者 1 时,它包含一个长整型 (
- 接下来定义了另一个名为 ComplexUnion 的联合,其选择由长整型 (
总之,通过这种方式创建和管理联盟,使得在处理复杂数据时能够更加灵活,同时确保在任何时候,只能有一项有效的数据,从而节省空间并简化逻辑处理。这种设计允许程序员以最小化开销来表示和操作多态性的信息结构。
内容由零声教学AI助手提供,问题来源于学员提问