Если вам нужно выполнить итерации по карте, самый простой способ - использовать кортежи, так как получение правильного типа для typedef затруднительно. Вот как вы можете использовать кортежи:
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
Просто примечание, запятые будут работать здесь, потому что круглые скобки расположены вокруг ключа и значения. Препроцессор понимает только запятые и круглые скобки (а c99 требует, чтобы он также понимал кавычки). Таким образом, он не может разобрать <>
в std::pair<int, double>
. Однако мы можем использовать скобки, чтобы помочь препроцессору. Например, если у нас есть функция, которая возвращает контейнер, который вызывается так:
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
Итак, мы можем поместить круглые скобки вокруг выражения, и это поможет препроцессору:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
Однако в случае карты мы не можем поместить круглые скобки вокруг объявления (потому что это не выражение). Так что это не сработает:
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
Потому что он будет преобразован в нечто подобное (std::pair<int, double> p) = *it
, и это, конечно, неверно в C ++. Но использование галстука сработает:
BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work
Нам просто нужно объявить ключ и значение вне цикла (как показано выше). Плюс, это может заставить цикл иметь более значимые имена. Вы можете написать key
вместо p.first
и value
вместо p.second
.