다음 매크로를 시도하고 정의 할 수 있습니다.
#define for_range(_type, _param, _A1, _B1) for (bool _ok = true; _ok;)\
for (_type _start = _A1, _finish = _B1; _ok;)\
for (int _step = 2*(((int)_finish)>(int)_start)-1;_ok;)\
for (_type _param = _start; _ok ; \
(_param != _finish ? \
_param = static_cast<_type>(((int)_param)+_step) : _ok = false))
이제 당신은 그것을 사용할 수 있습니다 :
enum Count { zero, one, two, three };
for_range (Count, c, zero, three)
{
cout << "forward: " << c << endl;
}
부호없는 정수, 열거 형 및 문자를 통해 앞뒤로 반복하는 데 사용할 수 있습니다.
for_range (unsigned, i, 10,0)
{
cout << "backwards i: " << i << endl;
}
for_range (char, c, 'z','a')
{
cout << c << endl;
}
어색한 정의에도 불구하고 매우 잘 최적화되어 있습니다. VC ++에서 디스어셈블러를 보았습니다. 코드는 매우 효율적입니다. 끝내지 말고 세 개의 for 문을 사용하십시오. 컴파일러는 최적화 후 하나의 루프 만 생성합니다! 닫힌 루프를 정의 할 수도 있습니다.
unsigned p[4][5];
for_range (Count, i, zero,three)
for_range(unsigned int, j, 4, 0)
{
p[i][j] = static_cast<unsigned>(i)+j;
}
공백이있는 열거 된 유형을 반복 할 수는 없습니다.