Благодаря принятому ответу я смог исправить свой макрос C ++. Он не чистый, но поддерживает вложение, разбиение и продолжение, а для list<t>
он позволяет перебирать t&
вместо list<t>::elem*
, поэтому вам не нужно разыменовывать.
template <typename t> struct list { // =list=
struct elem {
t Data;
elem* Next;
};
elem* Head;
elem* Tail;
};
#define for_list3(TYPE, NAME, NAME2, LIST) \
bool _##NAME##NAME2 = true;\
for (list<TYPE>::elem* NAME##_E = LIST.Head;\
NAME##_E && _##NAME##NAME2;\
_##NAME##NAME2 = !_##NAME##NAME2, NAME##_E = NAME##_E->Next) \
for (auto& NAME = NAME##_E->Data; _##NAME##NAME2; _##NAME##NAME2=false)
#define for_list2(TYPE, NAME, NAME2, LIST) for_list3(TYPE, NAME, NAME2, LIST)
#define for_list(TYPE, NAME, LIST) for_list2(TYPE, NAME, __COUNTER__, LIST)
void example() {
list<string> Words;
for_list(string, Word, Words) {
print(Word);
}
}
С помощью макроса for_each_item
из принятого ответа вам нужно будет сделать следующее:
void example2() {
list<string> Words;
for_each_item(string, Elem, Words) {
string& Word = Elem->Data;
print(Word);
}
}
Если вы хотите переписать его в чистую версию, не стесняйтесь редактировать.