Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重复使用嵌套循环,无需复制和粘贴_C++_Loops_Macros_Foreach_Nested Loops - Fatal编程技术网

C++ 重复使用嵌套循环,无需复制和粘贴

C++ 重复使用嵌套循环,无需复制和粘贴,c++,loops,macros,foreach,nested-loops,C++,Loops,Macros,Foreach,Nested Loops,假设我有这个嵌套循环 for (int a=1; a<MAX_A; ++a) for (int b=1; b<MAX_B; ++b) for (int c=1; c<MAX_C; ++c) { do_something(a, b ,c); } 对于(int a=1;a使用模板: template<typename Func> inline void do_something_loop(Func f) { for (

假设我有这个嵌套循环

for (int a=1; a<MAX_A; ++a)
  for (int b=1; b<MAX_B; ++b)
    for (int c=1; c<MAX_C; ++c)
    {
       do_something(a, b ,c);
    }
对于(int a=1;a使用模板:

template<typename Func>
inline void do_something_loop(Func f)
{
    for (int a=1; a<MAX_A; ++a) 
      for (int b=1; b<MAX_B; ++b) 
        for (int c=1; c<MAX_C; ++c) 
        { 
           f(a, b ,c); 
        } 
}
或使用函数对象:

struct do_something
{
    void operator()(int a, int b, int c) { /* stuff */ }
};

do_something_loop(do_something()); 
或者,如果您的编译器支持C++11,即使使用lambda:

do_something_loop([](int a, int b, int c) { /* stuff */ });

请注意,您也可以将
f
参数声明为带有签名
void(*f)(int,int,int)
的函数指针,而不使用模板,但灵活性较低(它不适用于函数对象(包括std::bind的结果)或lambdas)。

生成一个helper循环函数:

template<typename Work>
void loop(Work work) {
  for (int a=1; a<MAX_A; ++a)
    for (int b=1; b<MAX_B; ++b)
      for (int c=1; c<MAX_C; ++c)
      {
        work(a, b ,c);
      }
}
然后使用:

loop(some_work);

请注意,现在您不需要只使用函数,但可以使用函数对象(重载了
运算符()
的对象)。

1/
do
是一个关键字(未测试代码的幽灵…)2 / <代码>和<代码> C++之前,不需要某些工作< /COD>,函数引用被简单地转换为函数指针。这是可以的,但是我需要每次定义函数(没有C++ 11)。宏的优点是,我可以编写如下的代码:<代码> MyBooLook {V[A]=10;VV[A] [B] [C]=A+1;}MYLOOP_END;
是的,没有lambdas,除了宏之外,没有其他方法可以做到这一点。
void some_work(int a, int b, int c) {
}
loop(some_work);