Variant 2.0
Completion requirements
Mit unserem Wissen über Enums lassen sich bessere Variants definieren als mit Unions allein. Bei unserer bisherigen Lösung konnte das Feld "type" jeden Wert im Wertebereich eines Integers annehmen, obwohl nahezu alle Werte keine Entsprechung in der Union haben. Ersetzen wir den Integer durch ein Enum, können wir den Wertebereich auf die tatsächlich notwendigen Werte beschränken. Außerdem können die Werte Namen bekommen, ohne den Präprozessor zu benutzen.
#include <stdalign.h>
#include <stdio.h>
enum variant_type {
VARIANTTYPE_INT,
VARIANTTYPE_DOUBLE
};
struct variant {
union {
int i;
double d;
};
enum variant_type type;
};
void print_variant(struct variant var)
{
if (var.type == VARIANTTYPE_INT) {
printf("INT: %d\n", var.i);
}
if (var.type == VARIANTTYPE_DOUBLE) {
printf("DOUBLE: %f\n", var.d);
}
}
int main()
{
struct variant var1 = { .i = 42, .type = VARIANTTYPE_INT };
struct variant var2 = { .d = 13.37, .type = VARIANTTYPE_DOUBLE};
print_variant(var1);
print_variant(var2);
printf("sizeof(struct variant) : %zd\n", sizeof(struct variant));
printf("alignof(struct variant): %zd\n", alignof(struct variant));
return 0;
}Last modified: Friday, 18 May 2018, 5:29 PM