Итерация по переменным структуры - PullRequest
4 голосов
/ 05 февраля 2010

Я хочу получить итератор для структурирования переменной для установки конкретного итератора во время выполнения в соответствии с идентификатором enum. например -

struct {
char _char;
int _int;
char* pchar;
};

enum {
_CHAR, //0
_INT,  //1
PCHAR  //2
};

int main()
{
    int i = 1; //_INT
    //if i = 1 then set variable _int of struct to some value.
}

Вы можете сделать это без if / else или операторов переключения регистра?

Ответы [ 4 ]

7 голосов
/ 05 февраля 2010

Нет, C ++ не поддерживает это напрямую.

Однако вы можете сделать нечто очень похожее, используя boost :: tuple :

enum {
CHAR, //0
INT,  //1
DBL   //2
};

tuple<char, int, double> t('b', 1, 3.14);

int i = get<INT>(t);  // or t.get<INT>()

Возможно, вы также захотите взглянуть на boost :: variable .

.
3 голосов
/ 05 февраля 2010

C ++ не поддерживает это. Чтобы перебрать членов структуры, вам понадобится какой-то способ узнать, что такое члены структуры. Скомпилированные программы C ++ не обладают этой информацией. Для них структура - это просто набор байтов.

Такие языки, как C # (на самом деле .NET) и Java, могут это делать, поскольку они хранят информацию о структурах (информацию об отражении) вместе с программой.

Если вы действительно отчаянно нуждаетесь в этой функции, вы можете попытаться реализовать ее, проанализировав файл символов, созданный компилятором. Это, однако, чрезвычайно продвинуто, и вряд ли оно того стоит.

2 голосов
/ 05 февраля 2010

Нет. C и C ++ не разрешают этого.

Вы должны определить операторы if / else или switch / case.

1 голос
/ 05 февраля 2010

Неа. В C ++ вы обычно делаете что-то подобное для перечислений:

enum VarTypes {
 vtChar = 0,
 vtInt,
 vtDouble,

 vtFirst = vtChar,
 vtLast = vtDouble
};

Вам все еще понадобится блок переключателей для установки членов в структуре. Если вы чувствуете себя таким склонным, взгляните на некоторую реализацию Variant в коде Microsoft. Это похоже на то, что вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...