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

时间:2017-09-26 07:54:59

标签: 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];
}

所以我可以在其他方法中调用:

  • ForEachChild(DoStuff1(10));
  • ForEachChild(DoStuff2(5.0f));
  • ForEachChild(DoStuff3(15, 12.0f));
  • DoStuff4(...)重载也会很好,但不是严格需要的

或者,如果可能的话:

  • ForEachChild()->DoStuff1(10);

ForEachChild()将通过children列表进行迭代,并且对于每个非空指针,将调用它被要求调用的方法,并使用它只是向前转发的变量。

我必须为所有孩子做很多事情,而不是在所有这些地方都添加循环,我希望尽可能保持代码的可读性。

修改。添加了关于DoStuff3()的内容,以明确方法数量的参数未被修复。并DoStuff4()

1 个答案:

答案 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 ...

Demo