如何重构嵌套for循环?

LIA*_* Ke 4 c++ algorithm refactoring for-loop function

我有两个类似的功能。这两个函数都包含一个嵌套for循环。我如何结合这两个函数来减少重复的代码。

funcA和之间的唯一区别funcB是循环中的funcB调用。func_2

这两个函数如下所示。

void funcA()
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            func_1();
        }
    }
}

void funcB() 
{
    for (int i = 0; i < size; i++) 
    {
        for (int j = 0; j < size; j++)
        {
            func_1();
            func_2();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*yan 7

您可以使用可变参数模板

template<class ... FuncTypes>
void funcAB(FuncTypes... Funcs)
{
    for(int i = 0; i < size; ++i) {
        for(int j = 0; j < size; ++j) {
            (Funcs(), ...);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是如何调用该函数。

funcAB(&func_1); // if you want to only call func_1
funcAB(&func_1, &func_2) // if you want both to be called
Run Code Online (Sandbox Code Playgroud)


for*_*818 5

也许我有点太过分了,但是嵌套循环没有明显的原因(也不func_1()依赖func_2()ior j)。传递可调用对象的直接方法如下:

 template <typename F>
 void func(F f) {
      for (int i=0; i < size*size; ++i) f();
 }
Run Code Online (Sandbox Code Playgroud)

然后打电话

 func([](){ func_1(); });
 func(&func_1);               // passing function pointer works as well
Run Code Online (Sandbox Code Playgroud)

或者

 func([](){ func_1(); func_2(); });
Run Code Online (Sandbox Code Playgroud)

PS:嵌套循环和平面循环之间有一个区别,即size*size可以溢出或为负数。尽管传递可调用对象与此正交。