У меня есть макрос "foreach", который я часто использую в С++, который работает для большинства контейнеров STL:
#define foreach(var, container) \
for(typeof((container).begin()) var = (container).begin(); \
var != (container).end(); \
++var)
(Обратите внимание, что 'typeof' является расширением gcc.) Он используется следующим образом:
std::vector< Blorgus > blorgi = ...;
foreach(blorgus, blorgi) {
blorgus->draw();
}
Я хотел бы сделать что-то подобное, итерации над значениями карты. Назовите его "foreach_value", возможно. Поэтому вместо написания
foreach(pair, mymap) {
pair->second->foo();
}
Я бы написал
foreach_value(v, mymap) {
v.foo();
}
Я не могу придумать макрос, который сделает это, потому что он требует объявления двух переменных: итератора и переменной значения ('v', выше). Я не знаю, как это сделать в инициализаторе цикла for, даже используя расширения gcc. Я могу объявить его непосредственно перед вызовом foreach_value, но затем он будет конфликтовать с другими экземплярами макроса foreach_value в той же области. Если бы я мог суффикс текущего номера строки для имени переменной итератора, это сработало бы, но я не знаю, как это сделать.