c+中的Foreach语句+;语言扩展呢? < P>可以在C++中用宏声明来模拟FURACH语句。我使用类似的语法以以下方式循环数组: int array1[10]; vector<int> array2(10); fori(array1) forj(array2) fork(123) if(array1[i]==array[j]) return true; int-array1[10]; 矢量阵列2(10); fori(阵列1) forj(array2) 叉子(123) if(数组1[i]==数组[j]) 返回true; 你喜欢用什么方式来扩展C++语言?
编辑: 问题中提到的宏观政策的实施是:c+中的Foreach语句+;语言扩展呢? < P>可以在C++中用宏声明来模拟FURACH语句。我使用类似的语法以以下方式循环数组: int array1[10]; vector<int> array2(10); fori(array1) forj(array2) fork(123) if(array1[i]==array[j]) return true; int-array1[10]; 矢量阵列2(10); fori(阵列1) forj(array2) 叉子(123) if(数组1[i]==数组[j]) 返回true; 你喜欢用什么方式来扩展C++语言?,c++,syntax,macros,foreach,C++,Syntax,Macros,Foreach,编辑: 问题中提到的宏观政策的实施是: #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<g
#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;}
#为(inti=0;i定义i(a)你应该签出
向量v;
v、 推回(1);
v、 推回(2);
v、 推回(3);
v、 推回(4);
v、 推回(5);
增压器(内部和i、v)
{
i=i*i;
}
如果出于某种原因我需要跳过STL容器,我将此宏用于容器类:
#define M_foreach( iterable ) \
do {\
(iterable).prepareit();\
while ( (iterable).stepit() ) {
#if !defined( M_end )
# define M_end } } while( 0 );
#endif
(该宏假设您使用的容器具有迭代接口)
我发现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)
#包括
#为每个(续,iter)定义
对于(BOOST_TYPEOF(cont)::常量迭代器iter=cont.begin(),e=cont.end()\
iter!=e\
++国际热核聚变实验堆(iter)
适用于标准容器
这样使用:
vector<int> vi;
// ...
FOR_EACH(vi, i)
cout << *i;
向量vi;
// ...
每个(vi,i)的
cout My 2×:使用std::for_每个模板比使用宏更合适。也许你至少可以共享你的宏的实现。为什么你不在宏中把变量作为参数,这样你就有一个宏来表示无限数量的变量名?而不是你手工编写的。因为我的代码使用大量循环。当您有包含10个函数的cpp文件,并且每个函数都以一个循环开始时,每次写入BOOST_FOREACH(int&i,xxx)似乎太过分了。即使使用visual studio的自动完成功能(在c中)它开始让我感到不安。所有这些重复的字符和迭代器类型都以某种特定的顺序出现。通常我甚至不反对代码重复。我想是那些特殊的字符,如逗号和分号让我感到不安。:)在分享之前,也许您应该编写它们,以符合人们对语言扩展的期望。foreach已经有了几种语言的定义,也许看看这些语言可以帮助你在目前写一个更好的版本,你的版本几乎没有用。你在用你自己的版本,不是吗?是的,Boost。Foreach工作得非常好。是的,它非常适合编写快速、易懂的代码。比你用的宏好多了,我喜欢。BOOST_FOREACH、BOOST::function和BOOST::shared_ptr+1。Boost foreach很整洁。您可能已经意识到了,但您的示例也将从boost assign中受益!v+=1,2,3,4,5;我讨厌boost foreach的唯一一点是早上这样大声喊叫。
#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
*/