Re[4]: No more ugly functors
От: alexander_v Германия  
Дата: 19.11.03 09:06
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.