У меня есть макрос 'foreach', который я часто использую в C ++, который работает для большинства контейнеров 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 в той же области видимости. Если бы я мог добавить суффикс текущего номера строки к имени переменной итератора, это бы сработало, но я не знаю, как это сделать.