Как определить, какой тип используется в объединении? - PullRequest
4 голосов
/ 28 февраля 2012

Можно ли определить, какой тип содержится в объединении, если есть несколько возможных вариантов?

typedef union
{
    char     charArr[SIZE];
    int      intVal;
    float    floatVal;
} VALUE_TYPE;

VALUE_TYPE number;
number.intVal = 8;

Как узнать, что здесь содержится в объединении, если значение было установлено откуда-то еще?

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

Это правильно, что вы не можете делать такие вещи из коробки.

Распространенный способ обойти это заключается в том, что вы можете добавить тип вместе со своим объединением. Например, это может быть:

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. Так они хранят разные типы значений в одном и том же объекте. Подробнее см. на этой странице .

1 голос
/ 28 февраля 2012

Нет, вы не можете сказать, язык не имеет возможности для этого.

Вы должны следить за этим самостоятельно, если вам нужна эта информация.

0 голосов
/ 28 февраля 2012

Используя объединение, вы должны отслеживать любой тип, который вы в него вставили, и убедиться, что вы получаете нужный тип в нужное время.

Не используйте союзы. У вас действительно есть такие проблемы с памятью, которые требуют экономии места?

...