传递方法作为模板化参数C ++ 11

时间:2018-06-14 15:19:58

标签: c++ c++11 templates parameter-passing

我有这个结构:

class A {
  public:
     int setI(int i){_i = i;}
  private:
     int _i;
}
class B {
  public:
     int setZ(int z){_z = z;}
  private:
     int _z;
}
class C : public A, public B {};

然后我想从其他地方的模板化函数调用方法setI或setZ

类似的东西:

template <class P>
void myMethod(P &myclass, void (P::*setter) (const int)) const
   {
         int var = 9;
         (myclass.*setter)(var);
   }

我使用这样的方法:

   C c;
   mymethod(c, &C::setI); 

失败是因为setI在A中定义而不是在C中定义,是否有任何方法可以在此结构后从A类或B类传递方法?

谢谢和问候

1 个答案:

答案 0 :(得分:2)

部分失败是因为C::setIprotected。通过制作C::setI public,可以访问该段代码。

另一部分void(P::*setter)(const int)不是C::setI的类型。它应该是int(P::*setter)(int)

或者,将lambda传递给myMethod,它可以使您不必拼出成员函数指针类型,它可以更有效:

template<class P, class Setter>
void myMethod(P &myclass, Setter set) {
    int var = 9;
    set(myclass, var);
}

int main() {
    C c;
    myMethod(c, [](C& c, int a) { c.setI(a); }); 
}

您可能还想为-Wall -Wextra -Werrorgcc启用警告(clang),以便在函数忘记返回值时编译失败,例如setI和{ {1}}做。