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); });
}