【发布时间】:2009-07-11 06:24:20
【问题描述】:
您可以在 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;}
【问题讨论】:
-
我的 2¢:使用 std::for_each 模板比使用宏更合适。
-
也许你至少可以分享你的宏的实现。
-
为什么不直接把变量作为宏中的参数,所以你有一个宏可以无限个变量名呢?而不是你手写的。
-
因为我的代码使用了很多循环。当你有 10 个函数的 cpp 文件,并且每个函数都以循环开头时,每次都写 BOOST_FOREACH(int& i, xxx) 似乎有些过分。即使在使用 Visual Studio 的自动完成功能(在 c# 中)时,它也开始让我感到不安。所有那些以特定顺序重复的字符和迭代器类型。通常我什至不反对代码重复。我想是逗号和分号之类的特殊字符让我感到紧张。 :)
-
在你分享之前,也许你应该编写它们以符合人们期望的语言扩展的样子。 foreach 已经有几种语言的定义,也许看看那些会帮助你写出更好的定义,而你的定义几乎没用。