您可以使用宏声明模拟c ++中的foreach语句。我使用类似的语法以下列方式循环数组:
int array1[10];
vector<int> array2(10);
fori(array1)
forj(array2)
fork(123)
if(array1[i]==array[j])
return true;
您最喜欢的以某种方式扩展c ++语言的宏是什么?
编辑:
问题中提到的宏的实现是:
#define fori(a) for(int i=0;i<getsize(a);i++)
#define forj(a) for(int j=0;j<getsize(a);j++)
#define foru(a) for(int u=0;u<getsize(a);u++)
#define fork(a) for(int k=0;k<getsize(a);k++)
#define forl(a) for(int l=0;l<getsize(a);l++)
template<typename T>
int getsize(T& v ){return v.size();}
template<typename T,int N>
int getsize(T(&v)[N]){return N;}
int getsize(int v){return v;}
答案 0 :(得分:8)
您应该查看Boost.Foreach。
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
BOOST_FOREACH(int& i, v)
{
i = i * i;
}
答案 1 :(得分:1)
如果由于某种原因我需要跳过 STL容器,我将这个宏用于我的容器类:
#define M_foreach( iterable ) \
do {\
(iterable).prepareit();\
while ( (iterable).stepit() ) {
#if !defined( M_end )
# define M_end } } while( 0 );
#endif
(宏假定您使用的容器具有迭代接口)
Container foo;
M_foreach ( foo )
...
Container bar;
M_foreach ( bar )
...
M_end
...
M_end
答案 2 :(得分:0)
我发现boost的宏有点麻烦。
这是我的尝试:
#include <boost/typeof/typeof.hpp>
#define FOR_EACH(cont, iter) \
for (BOOST_TYPEOF(cont)::const_iterator iter = cont.begin(), e = cont.end(); \
iter != e; \
++iter)
适用于标准容器。
像这样使用:
vector<int> vi;
// ...
FOR_EACH(vi, i)
cout << *i;
支持嵌套:
map<string, list<int> > msli;
msli["key1"].push_back(1);
msli["key1"].push_back(2);
msli["key2"].push_back(3);
msli["key2"].push_back(4);
FOR_EACH(msli, i) {
cout << i->first << endl;
FOR_EACH(i->second, j)
cout << "\t" << *j << endl;
}
/*
Prints:
key1
1
2
key2
3
4
*/
来源:http:/wtw.tw/papers/foreach.html