gpt4 book ai didi

c++ - 如何多次调用具有不同参数的函数成员?

转载 作者:行者123 更新时间:2023-12-03 07:02:05 27 4
gpt4 key购买 nike

我的类(class)具有遵循简单模式的功能,但我不知道是否有办法避免代码重复,所以它会更短。这是简化的示例:

class Data
{
public:
void compute()
{
if (procedure1)
{
runAlpha(param1);
runAlpha(param2);
runAlpha(param3);
}
if (procedure2)
{
runBeta(param1);
runBeta(param2);
runBeta(param3);
}
if (procedure3)
{
runGamma(param1);
runGamma(param2);
runGamma(param3);
}
}
}
runAlpha , runBeta , runGamma也是这个类的公共(public)成员。如您所见,每个 procedure 之间几乎没有区别。也介于 run 之间来电。我想稍微简化一下这段代码,但我不允许修改 run函数,所以我考虑使用模板。但是,添加 callMultipleRuns分类方法和替换 if 语句的主体不会编译。
template <typename Run>
void callMultipleRuns(Run r)
{
r(param1);
r(param2);
r(param3);
}

void compute()
{
if (procedure1)
callMultipleRun(runAlpha);
if (procedure2)
callMultipleRun(runBeta);
if (procedure3)
callMultipleRun(runGamma);
}
错误是 error: invalid use of non-static member function .我无法添加 staticrun宣言。有没有办法解决它?

最佳答案

首先,您发现不能简单地将非静态成员函数作为参数传递。但是,您可以传递对成员函数的引用。这必须采用标准规定的特定形式。
一些示例代码

#include <cstdio>
class Data {
public:
void runAlpha(int i) { printf("a%d", i); };
void runBeta(int i) { printf("b%d", i); };
void runGamma(int i) { printf("c%d", i); };

template <typename Run>
void callMultipleRuns(Run r)
{
(this->*r)(1);
(this->*r)(2);
(this->*r)(3);
}

void compute()
{
if (true) callMultipleRuns(&Data::runAlpha);
if (true) callMultipleRuns(&Data::runBeta);
if (true) callMultipleRuns(&Data::runGamma);
}
};

int main() {
Data{}.compute();
}
on Godbolt

关于c++ - 如何多次调用具有不同参数的函数成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64498563/

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