#include <stdio.h>
#include <stdlib.h>
typedef enum {
INT,
STR,
} type;
typedef struct {
type type;
union {
char *s;
int i;
};
} variant_t;
#define VARIANT(x) _Generic((x), \
int: ((variant_t){.type = INT, .i = x}), \
char*: ((variant_t){.type = STR, .s = x}) \
)
void foo_int(int i)
{
}
void foo_str(char *s)
{
}
#define foo(x) (_Generic((x), \
int: foo_int, \
char*: foo_str \
)(x))
void dynamic_foo(variant_t pitux)
{
switch (pitux.type) {
case INT: foo(pitux.i); break;
case STR: foo(pitux.s); break;
default: error("Error!"); break;
}
}
int main(void)
{
for (int i = 0; i < 10; ++i) {
dynamic_foo
(rand() & 1 ? VARIANT
(42): VARIANT
("forty two")); }
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCnR5cGVkZWYgZW51bSB7CglJTlQsCglTVFIsCn0gdHlwZTsKCnR5cGVkZWYgc3RydWN0IHsKCXR5cGUgdHlwZTsKCXVuaW9uIHsKCQljaGFyICpzOwoJCWludCBpOwoJfTsKfSB2YXJpYW50X3Q7CgojZGVmaW5lIFZBUklBTlQoeCkgX0dlbmVyaWMoKHgpLCBcCglpbnQ6ICgodmFyaWFudF90KXsudHlwZSA9IElOVCwgLmkgPSB4fSksIFwKCWNoYXIqOiAoKHZhcmlhbnRfdCl7LnR5cGUgPSBTVFIsIC5zID0geH0pIFwKKQoKdm9pZCBmb29faW50KGludCBpKQp7CglwcmludGYoIkludGVnZXIgJWRcbiIsIGkpOwp9Cgp2b2lkIGZvb19zdHIoY2hhciAqcykKewoJcHJpbnRmKCJTdHJpbmcgXCIlc1wiXG4iLCBzKTsKfQoKI2RlZmluZSBmb28oeCkgKF9HZW5lcmljKCh4KSwgXAoJaW50OiBmb29faW50LCBcCgljaGFyKjogZm9vX3N0ciBcCikoeCkpCgp2b2lkIGR5bmFtaWNfZm9vKHZhcmlhbnRfdCBwaXR1eCkKewoJc3dpdGNoIChwaXR1eC50eXBlKSB7CgkJY2FzZSBJTlQ6IGZvbyhwaXR1eC5pKTsgYnJlYWs7CgkJY2FzZSBTVFI6IGZvbyhwaXR1eC5zKTsgYnJlYWs7CgkJZGVmYXVsdDogZXJyb3IoIkVycm9yISIpOyBicmVhazsKCX0KfQoKaW50IG1haW4odm9pZCkKewoJZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CgkJZHluYW1pY19mb28ocmFuZCgpICYgMSA/IFZBUklBTlQoNDIpOiBWQVJJQU5UKCJmb3J0eSB0d28iKSk7Cgl9CglyZXR1cm4gMDsKfQ==