【问题标题】:pass an object and one of its methods as an argument将对象及其方法之一作为参数传递
【发布时间】:2015-06-23 15:57:24
【问题描述】:

我有一个包含几种算法的模型,我必须以不同的方式多次测试这些算法。我非常困难仅仅为了测试(在这么多文件中)的目的而更改课堂上的任何内容。我想告诉编译器在哪个对象上运行哪个方法。每次,我都有两种算法要比较,我有超过 10 个测试文件 test1.cpp ... test10.cpp ... 。因此很难调整每个测试文件。每个文件中算法的名称也不同。我正在寻找一种将方法从main 传递给profiler 的方法。实际上只从主要调整一切。我只将算法复制/粘贴到模型类中,然后修复主函数而不更改类中的任何内容(在复制/粘贴算法之后)或配置文件函数。以下代码显示了我需要的内容。随意调整此代码的结构,而不会将模型类分成两个类。我必须只留一堂课。

请不要将这个问题发送(迁移)到代码审查,因为它是一个草稿代码(上次我因为某人的错误而获得了如此多的反对票。)

欢迎提出最简单、最易读的建议。

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

【问题讨论】:

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


    【解决方案1】:
    1. 你需要声明函数来获取成员函数

      void profiler(CModel &model, double (CModel::*algorithm)())
      
    2. 你需要给函数传递一个指向成员函数的指针

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

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

    更多详情请见C++, function pointer to member function

    【讨论】:

    • @ar2015 我刚刚注意到并为该部分添加了编辑。
    【解决方案2】:

    这样改变profiler函数怎么样?

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

    【讨论】:

    • 您甚至可以使用模板:template &lt;typename F&gt; void profiler(F f) { /*timer code*/ f(); },使用相同的调用语法。
    • f() 是一个 void()。泛型 F 在这里意义不大。
    猜你喜欢
    • 2018-04-13
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2022-01-22
    • 2013-05-14
    相关资源
    最近更新 更多