如何为所有非null变量调用方法

use*_*771 3 c++ lambda

给出以下代码:

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().

Whi*_*TiM 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];
}
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)

请注意,您需要使用强制转换来传递重载函数地址 ...

演示