您可以嘗試並定義下面的宏:
#define for_range(_type, _param, _A1, _B1) \
for (_type _param = _A1, _finish = _B1,\
_step = static_cast<_type>(2*(((int)_finish)>(int)_param)-1),\
_stop = static_cast<_type>(((int)_finish)+(int)_step); _param != _stop; \
_param = static_cast<_type>(((int)_param)+(int)_step))
現在你可以使用它:
for_range (unsigned, i, 10,0)
{
cout << "backwards i: " << i << endl;
}
它可用於通過無符號整數,枚舉和字符向後和向前遍歷:
for_range (char, c, 'z','a')
{
cout << c << endl;
}
enum Count { zero, one, two, three };
for_range (Count, c, zero, three)
{
cout << "forward: " << c << endl;
}
儘管它的定義很尷尬,但它的優化非常好。我在VC++中查看反彙編程序。代碼是非常有效的。不要被推遲,而是三個語句:編譯器在優化後只會產生一個循環!你甚至可以定義封閉的循環:
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;
}
你顯然不能遍歷具有間隙的枚舉類型。
如果我最初等於0呢? – 2011-03-28 11:22:11
我認爲這是做到這一點的方法。當C++引入size_t時,它讓我非常惱火,但我已經習慣了。 – 2011-03-28 11:22:57
然後i = 0;我<= 0;它按預期迭代一次... – dcousens 2011-03-28 11:23:03