首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将对象及其方法之一作为参数传递

将对象及其方法之一作为参数传递
EN

Stack Overflow用户
提问于 2015-04-17 00:46:28
回答 2查看 59关注 0票数 1

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

请不要发送(迁移)这个问题到代码审查,因为这是一个草案代码(上次我得到这么多的选票,只是因为错误的人)。

欢迎来到最简单、最易读的建议。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-17 00:51:11

  1. 您需要声明函数以获取成员函数。 void (CModel &model,double (CModel::*algorithm)())
  2. 需要将指向成员函数的指针传递给函数。 分析器(m1,&C模型:算法1);分析器(m2,&CModel::algorithm2 2);
  3. 您需要正确调用成员函数。 双结果=(模型.*算法)();

有关更多详细信息,请参阅C++, function pointer to member function

票数 3
EN

Stack Overflow用户

发布于 2015-04-17 01:03:14

用这种方式改变分析器功能怎么样?

代码语言:javascript
复制
#include <functional>

void profiler(std::function<void()> func) {
    // CTimer mytimer;
    // mytimer.start();
    func();
    // mytimer.stop();
    // std::cout<<"time elapsed: "<<mytimer.duration;   
}

使用分析器:

代码语言:javascript
复制
CModel m1, m2;
profiler([&m1](){
   double d = m1.algorithm1();
});
profiler([&m2](){
   double d = m2.algorithm2();
});

如果可能的话,也可以是同一个对象:

代码语言:javascript
复制
CModel m1;
profiler([&m1](){
   double d = m1.algorithm1();
});
profiler([&m1](){
   double d = m1.algorithm2();
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29688360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档