РЕДАКТИРОВАТЬ : Вопрос изменился еще раз. Теперь вопрос явно хочет реализовать цикл foreach. Самый простой ответ:
#include <boost/foreach.hpp>
void( std::vector<int>& v ) {
BOOST_FOREACH( int & x, v ) {
x = x*2;
}
}
Вставка переменной в блок кода
Это не предназначено как ответ, но чтобы показать более общую технику для введения переменной в блок кода. Кажется, что макрос, который ОП пытается определить, может использовать, даже если он влечет за собой некоторые издержки
Есть несколько мест, где вы можете определить переменную с разными областями действия. Вы можете определить переменную внутри любого блока кода, и ее срок службы будет до конца этого конкретного блока. Вы можете определить переменную в скобках цикла for, а область действия будет блоком цикла. Вы также можете определить переменную внутри блока if, и ее область будет такой же, как у if (включая предложение else).
Вы можете комбинировать эти опции выше, чтобы создавать внешние и вставлять переменные в блок кода, не создавая переменную, срок жизни которой превышает срок жизни блока. Практическим примером будет определение цикла foreach (упрощенного для работы только с контейнерами STL. Синтаксис вызова будет:
void f( std::vector<int>& container )
{
INTVECTOR_FOREACH( int & x, container )
{
x = x*2;
}
}
С семантикой, аналогичной foreach в других языках: x получает ссылку на каждый элемент в контейнере, так что функция фактически удваивает каждое значение внутри целочисленного вектора.
Теперь код упрощенного макроса:
#define INTVECTOR_FOREACH( variable, container ) \
for ( std::vector<int>::iterator it = container.begin(); it!=container.end(); ++it ) \
if ( bool condition=false ) {} else \
for ( variable = *it; !condition; condition=true )
Обобщение макроса для любого контейнера и типа требует некоторого метапрограммирования, которое выпадает из контекста вопроса, но идея его работы (я надеюсь) не должна быть слишком сложной для понимания.
Внешний для выполняет итерации по контейнеру, в каждой итерации мы выполняем еще одну для только один раз, определяя итерационную переменную (int & x в примере кода). Нам нужно условие для контроля количества итераций (1) внутреннего цикла, и это условие вводится с , если . Мы решаем сделать сбой if, чтобы гарантировать, что пользователь не получит неожиданных результатов, если он пишет else после цикла ... макросы хитры.