传递一个对象及其一个方法作为参数

时间:2015-04-17 00:46:29

标签: c++ algorithm c++11 parameter-passing function-pointers

我有一个带有一些算法的模型,我必须以不同的方式多次测试算法。对于我来说,仅仅为了测试(在如此多的文件中)更改类中的任何内容,非常难。我想告诉编译器在哪个对象上运行哪个方法。每次,我有两个比较算法,我有超过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;
}

2 个答案:

答案 0 :(得分:3)

  1. 您需要声明该函数以获取成员函数

    void profiler(CModel &model, double (CModel::*algorithm)())
    
  2. 您需要将函数传递给成员函数

    profiler(m1, &CModel::algorithm1);
    profiler(m2, &CModel::algorithm2);
    
  3. 您需要正确调用成员函数

    double result = (model.*algorithm)();
    

  4. 有关详细信息,请参阅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();
});