Здравствуйте, folk, Вы писали:
А>>Вот так не работает, к сожалению
А>>А>>FOR_EACH( pair<string,string>& i, mapStoS )
А>>
F>Проблема: препроцессор понимает запятую между string и string как разделитель аргументов макроса и ругается что макрос FOR_EACH не берет 3 аргумента.
F>Интересно что я до сих пор не сталкивался с такой проблемой, т.к. всегда пользуюсь value_type. Например:
F>F>typedef std::map<std::string, std::string> mapStoS_t;
F>mapStoS_t mapStoS;
F>...
F>FOR_EACH(mapStoS_t::value_type& i, mapStoS) ...
F>
Я считаю, что явно указывать тип переменной в заголовке цикла — лучше т.к. нагляднее демонстрирует по элементам какого типа будем проводить итерации ( контейнер может быть объявлен очень далеко от цикла ).
Предлагаю следующее решение относительно map :
#define CONCAT( p1, p2 ) p1##,##p2
#define FOR_EACH_M( Decl_p1, Decl_p2, Cont ) FOR_EACH( CONCAT( Decl_p1, Decl_p2 ), Cont )
// Использовать так
FOR_EACH_M( pair<const string, string>& thePair, mapStoS )
PS. Жалко что макросы нельзя перегружать — тогда можно было бы не выдумывать новое имя FOR_EACH_M