gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:33:31 28 4
gpt4 key购买 nike

我有这样的结构:

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

您可能还想为 gccclang 启用警告(-Wall -Wextra -Werror),以便在函数出现时编译失败忘记返回一个值,就像 setIsetZ 那样。

关于c++ - 将方法作为模板参数传递 C++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50860902/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com