Я хотел создать небольшой макрос для имитации (auto item: container) в VC2010, который я мог бы затем заменить на реальную конструкцию, когда она будет выпущена.
Существует BOOST_FOREACH, однако я хотел бы получить автоматическую поддержку.
Я пытался создать макрос.Однако он не работает, когда разыменованный итератор является константным типом.
#define _LIB_FOREACH_LINENAME_CAT(name, line) name##line
#define _LIB_FOREACH_LINENAME(name, line) _LIB_FOREACH_LINENAME_CAT(name, line)
#define LIB_AUTO_FOREACH(item, expr) \
decltype((expr))&& _LIB_FOREACH_LINENAME(con, __LINE__)((expr)); auto _LIB_FOREACH_LINENAME(it, __LINE__) = _LIB_FOREACH_LINENAME(con, __LINE__).begin(); for(auto (item) = *_LIB_FOREACH_LINENAME(con, __LINE__).begin(); _LIB_FOREACH_LINENAME(it, __LINE__) != _LIB_FOREACH_LINENAME(con, __LINE__).end(); ++_LIB_FOREACH_LINENAME(it, __LINE__), (item) = *_LIB_FOREACH_LINENAME(it, __LINE__))
Кто-нибудь готов ответить на вызов, чтобы исправить мою или найти работающую реализацию?
РЕДАКТИРОВАТЬ:
Уведомлениеэто (expr) должно быть оценено только один раз.