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)
您可以使用可变参数模板。
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)
也许我有点太过分了,但是嵌套循环没有明显的原因(也不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可以溢出或为负数。尽管传递可调用对象与此正交。