Варианты
Определенные структуры могут иметь варианты, базирующиеся на некотором знании того, что доступно в среде. Селектор должен иметь тип нумерованного элемента, который определяет возможные варианты структуры. Телу структуры варианта может быть присвоена метка для ссылок. Механизм, с помощью которого при работе выбирается вариант, языком презентации не определен.
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.