我有这个结构:
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类传递方法?
谢谢和问候
答案 0 :(得分:2)
部分失败是因为C::setI
是protected
。通过制作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 -Werror
和gcc
启用警告(clang
),以便在函数忘记返回值时编译失败,例如setI
和{ {1}}做。