Это правильно, что вы не можете делать такие вещи из коробки.
Распространенный способ обойти это заключается в том, что вы можете добавить тип вместе со своим объединением. Например, это может быть:
enum { charArr_type, float_type, int_type } VALUE_TYPE;
typedef union
{
char charArr[SIZE];
int intVal;
float floatVal;
} VALUE;
struct my_value {
VALUE val,
VALUE_TYPE val_type
}
После этого вам просто нужно будет обновить тип при назначении структуры:
my_value number;
number.val.intVal = 8;
number.val.val_type = is_int
Это обычный современный шаблон, когда вам нужен общий тип, способный хранить почти все.
Например, вы можете найти его везде в исходном коде PHP. Так они хранят разные типы значений в одном и том же объекте. Подробнее см. на этой странице .