Просто добавьте к другим ответам: это обычно называется вариантом типа данных, и имеет смысл сохранить тип enum в struct
вместе с union
, так как вы будете передавать его по всемвремя в любом случае.
Так что я бы рекомендовал поместить оба в struct
:
enum var_type
{
VAR_INT = 0,
VAR_FUNC = 1
};
struct variant
{
// contains the type of the stored value
enum var_type type;
// contains the actual value
union {
int(*fnPtr)(int);
int i;
};
};
И тогда у вас могут быть отдельные функции для создания каждого подтипа, для более простой реализации:
// wrap the int value in the variant struct
struct variant variant_create_int(int i)
{
return (struct variant){ .type = VAR_INT, .i = i };
}
// wrap the functino pointer in the variant struct
struct variant variant_create_func(int(*fnPtr)(int))
{
return (struct variant){ .type = VAR_FUNC, .fnPtr = fnPtr };
}
То есть ваш main
будет делать что-то вроде:
// create variant of type 'VAR_FUNC'
struct variant var = variant_create_func(&multiply_by_two);
и просто передаст структуру var
вперед.