我有一个带有一些算法的模型,我必须以不同的方式多次测试算法。对于我来说,仅仅为了测试(在如此多的文件中)更改类中的任何内容,非常难。我想告诉编译器在哪个对象上运行哪个方法。每次,我有两个比较算法,我有超过10个测试文件管理器test1.cpp
... test10.cpp
....因此很难调整每个测试文件。每个文件中的算法名称也不同。我正在寻找一种方法将方法从profiler
传递给main
。事实上,只从主要调整一切。我只将算法复制/过去到模型类中,然后修改main函数而不更改类中的任何内容(复制/粘贴算法后)或配置文件函数。以下代码显示了我需要的内容。您可以随意调整此代码的结构,而无需将模型类分为两类。我必须只保持一个班级。
请不要将此问题发送(迁移)到代码审核中,因为它是草稿代码(上次我因为某人的错误而获得了如此多的投票权。)
欢迎使用最简单,最易阅读的建议。
#include <iostream>
class CModel
{
public:
// ....
// ....
// ....
CModel()
{
}
double algorithm1()
{
double result=0;
// ...
return result;
}
double algorithm2()
{
double result=0;
// ...
return result;
}
};
void profiler(CModel &model,double (*algorithm)(void))
{
// CTimer mytimer;
// mytimer.start();
// using model fields here
double result=model.(*algorithm)();
// mytimer.stop();
std::cout<<"out: "<<result<<std::endl;
// std::cout<<"time elapsed: "<<mytimer.duration;
}
int main()
{
CModel m1, m2;
// m1.something= something else;
// m2.something= something else;
profiler(m1,m1.algorithm1); // *** impossible ***
profiler(m2,m2.algorithm2); // *** impossible ***
return 0;
}
答案 0 :(得分:3)
您需要声明该函数以获取成员函数
void profiler(CModel &model, double (CModel::*algorithm)())
您需要将函数传递给成员函数
profiler(m1, &CModel::algorithm1);
profiler(m2, &CModel::algorithm2);
您需要正确调用成员函数
double result = (model.*algorithm)();
有关详细信息,请参阅C++, function pointer to member function。
答案 1 :(得分:0)
如何以这种方式更改分析器功能?
#include <functional>
void profiler(std::function<void()> func) {
// CTimer mytimer;
// mytimer.start();
func();
// mytimer.stop();
// std::cout<<"time elapsed: "<<mytimer.duration;
}
使用探查器:
CModel m1, m2;
profiler([&m1](){
double d = m1.algorithm1();
});
profiler([&m2](){
double d = m2.algorithm2();
});
如果可能的话,或者只是同一个对象:
CModel m1;
profiler([&m1](){
double d = m1.algorithm1();
});
profiler([&m1](){
double d = m1.algorithm2();
});