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

Passing method as templated argument C++11

本文关键字:参数传递 C++11 方法      更新时间:2023-10-16

我有这个结构:

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 传递方法?

感谢和问候

它失败的部分原因是C::setIprotected。通过制作C::setIpublic来访问该段代码。

另一部分是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 -Werrorforgccclang(,以便在函数忘记返回值时编译失败,就像setIsetZ所做的那样。