给出以下代码:
class A {
void DoStuff1(int x);
void DoStuff2(float y);
void DoStuff3(int a, float b);
void DoStuff4(int c);
void DoStuff4(float c);
void ForEachChild(auto method);
A* children[4];
}
Run Code Online (Sandbox Code Playgroud)
所以在其他方法中我可以调用:
ForEachChild(DoStuff1(10));ForEachChild(DoStuff2(5.0f));ForEachChild(DoStuff3(15, 12.0f));DoStuff4(...) 重载也会很好,但不是严格需要的或者,如果可能的话:
ForEachChild()->DoStuff1(10);ForEachChild()将通过children列表进行迭代,并且对于每个非空指针,将调用它被要求调用的方法,其中变量只是向前转发.
我必须为所有孩子做很多事情,我宁愿不在所有这些地方添加一个循环,并且我希望尽可能保持代码的可读性.
编辑.添加了有关的内容DoStuff3(),以明确方法数量的参数不固定.并且DoStuff4().
您可以使用成员函数模板.
class A {
void DoStuff1(int x);
void DoStuff2(float y);
template<typename... T, typename... U>
void ForEachChild(void (A::*method)(T...), U&&... x){
for(auto child : children)
if(child) (child->*method)(std::forward<U>(x)...);
}
A* children[4];
}
Run Code Online (Sandbox Code Playgroud)
用作:
object.ForEachChild(&A::DoStuff1, 10);
object.ForEachChild(&A::DoStuff2, 3.1416);
object.ForEachChild(&A::DoStuff3, 3, 546.353);
object.ForEachChild(static_cast<void(A::*)(int)>(&A::DoStuff4), 3);
object.ForEachChild(static_cast<void(A::*)(float)>(&A::DoStuff4), 3);
Run Code Online (Sandbox Code Playgroud)