给出以下代码:
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];
}
所以我可以在其他方法中调用:
ForEachChild(DoStuff1(10));
ForEachChild(DoStuff2(5.0f));
ForEachChild(DoStuff3(15, 12.0f));
DoStuff4(...)
重载也会很好,但不是严格需要的或者,如果可能的话:
ForEachChild()->DoStuff1(10);
ForEachChild()
将通过children
列表进行迭代,并且对于每个非空指针,将调用它被要求调用的方法,并使用它只是向前转发的变量。
我必须为所有孩子做很多事情,而不是在所有这些地方都添加循环,我希望尽可能保持代码的可读性。
修改。添加了关于DoStuff3()
的内容,以明确方法数量的参数未被修复。并DoStuff4()
。
答案 0 :(得分:6)
您可以使用成员函数模板。
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];
}
并用作:
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);
请注意,您需要使用强制转换来传递address of an overloaded function ...