【问题标题】:Foreach-statement in c++ and language extension?c++ 中的 Foreach 语句和语言扩展?
【发布时间】: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 已经有几种语言的定义,也许看看那些会帮助你写出更好的定义,而你的定义几乎没用。

标签: c++ syntax macros foreach


【解决方案1】:

您应该查看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;
}

【讨论】:

  • 那么您使用的是您自己的版本,不是吗?是的,Boost.Foreach 效果很好。
  • 是的,它非常适合编写快速、易于理解的代码。比您使用的宏要好得多。
  • 我喜欢它。 BOOST_FOREACH、boost::function 和 boost::shared_ptr
  • +1。 Boost foreach 很整洁。您可能已经意识到,但您的示例也将从 boost assign 中受益! v += 1, 2 ,3, 4, 5;
  • boost foreach 唯一让我讨厌的地方是它在早上那样大喊大叫。
【解决方案2】:

如果出于某种原因我需要跳过 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

【讨论】:

    【解决方案3】:

    我觉得 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多