Варианты
Определенные структуры могут иметь варианты, базирующиеся на некотором знании того, что доступно в среде. Селектор должен иметь тип нумерованного элемента, который определяет возможные варианты структуры. Телу структуры варианта может быть присвоена метка для ссылок. Механизм, с помощью которого при работе выбирается вариант, языком презентации не определен.
struct {
T1 f1; | |
T2 f2; | |
.... | |
Tn fn; | |
select (E) { | |
case e1: Te1; | |
case e2: Te2; | |
.... | |
case en: Ten; | |
} [[fv]];} [[Tv]]; |
Например:
enum { apple, orange } VariantTag;
struct {
uint16 number; | |
opaque string<0..10>; /* переменная длина */ | |
} V1; |
struct {
uint32 number; | |
opaque string[10]; /* фиксированная длина */ | |
} V2; |
struct {
select (VariantTag) { | /* value of selector is implicit */ | |||
case apple: V1; | /* VariantBody, tag = apple */ | |||
case orange: V2; | /* VariantBody, tag = orange */ | |||
} variant_body; | /* optional label on variant */ | |||
} VariantRecord; |
Структуры варианта могут быть подготовлены (сужены) путем спецификации значения селектора до спецификации типа. Например: orange VariantRecord является суженным типом для VariantRecord, содержащего variant_body типа V2.