Работает ли этот фрагмент кода (макрос для обхода контейнера)?если да, то почему? - PullRequest
1 голос
/ 24 марта 2011

Следуя обучающей программе Дмитрия Королева по TopCoder, я столкнулся с макросом generic-container-traverse:

#define tr(c,i) for(typeof((c).begin() i = (c).begin(); i != (c).end(); i++) 

Это смущает меня, потому что, кажется, отсутствует скобка. И в объяснении он говорит, что typeof (...) заменяется типом выражения (...), что делает меня более запутанным с этим макросом перемещения (поскольку моя интуиция видит typeof (x; y; z) и не будет работать, поскольку x; y; z не является выражением, и даже если бы оно работало, typeof (...) "съел бы" (...)).

Это работает? почему?

Ответы [ 4 ]

7 голосов
/ 24 марта 2011
#define tr(container, it) \ 
 for(typeof(container.begin()) it = container.begin(); \ 
                               it != container.end(); \
                                it++
    )

Это то, что он написал , что является синтаксически правильным.BTW typeof является расширением gcc и не будет работать в других компиляторах.

Если ваш компилятор поддерживает C ++ 0x, вы можете использовать auto

Например, такой же макрос может быть написан на C ++ 0x как

#define tr(container, it) \ 
 for(auto it = container.begin(); \ 
          it != container.end(); \
          it++
    )
0 голосов
/ 24 марта 2011

Это неправильно. Должно быть:

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
0 голосов
/ 24 марта 2011

Будет нормально работать, если после typeof((c).begin() будет лишний парен. Я не знаю, каков был первоначальный источник, но если на самом деле ему не хватало парена, то тот, кто его написал, вероятно, напечатал его неправильно.

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)

Может использоваться вместо верхней строки цикла for над контейнером. например:

tr(myvector, i)
{
    std::cout << *i;
}
0 голосов
/ 24 марта 2011

Это опечатка.Должно быть:

#define tr(c,i) for(typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...