C++ 将方法作为模板参数C++;11

C++ 将方法作为模板参数C++;11,c++,c++11,templates,parameter-passing,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>

我有这样的结构:

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);
   }
它失败是因为setI是在A中定义的,而不是在C中定义的。有没有办法按照这种结构从类A或类B传递方法


感谢并问候

它之所以失败,部分原因是
C::setI
受到
保护
。通过使
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); }); 
}
模板
void myMethod(P&myclass,Setter set){
int-var=9;
set(myclass,var);
}
int main(){
C C;
myMethod(c,[](c&c,inta){c.setI(a);});
}


您可能还希望为
gcc
clang
启用警告(
-Wall-Wextra-Werror
),以便在函数忘记返回值时编译失败,如
setI
setZ
do。

谢谢,我将修改该示例,因为事件将两个setter都设置为publicfails@RuLoViC为您更新了答案。
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); }); 
}