2015-06-21 112 views
-2

我正在尝试使用一个函数来创建测量类,该函数将函数作为参数进行度量。其所谓的ChronoTimer.h内容是:带有可变参数的函数作为函数C++的参数

#include <chrono> 

template<typename TimeT = std::chrono::milliseconds, class ClockT = 
std::chrono::system_clock> 

class ChronoTimer { 
public: 
    template<typename F, typename ...Args> 

    static typename TimeT::rep duration(F func, Args&&... args) 
    { 
     auto start = ClockT::now(); 
     func(std::forward<Args>(args)...); 
     return std::chrono::duration_cast<TimeT>(ClockT::now() - start); 
    } 
}; 

然后,我有“SomeClass的”哪里是我想要测量的功能,和功能,我想测量

#include "ChronoTimer.h" 
long int someClass::measuredF(long end) { 
    long int cnt = 0; 
    for (long int i = 0; i < end; ++i) { 
     cnt = cnt + i; 
    } 
    return cnt; 
} 

void someClass::someFunction() { 
    long int end = 10; 
    auto duration = ChronoTimer<>::duration(someClass::*measuredF, end).count(); 
} 

有一个错误的函数并且我没有足够的C++知识来获得它的工作。感谢任何帮助,谢谢

+0

开始与更换'SomeClass的* ::通过'measuredF'&SomeClass的:: measuredF' –

+0

你好彼得,感谢您的回复。我改变了你的建议,但我仍然得到很多错误,如: '错误:成员参考基本类型'typename duration > :: rep'(又名'long long')不是结构或结合 自动持续时间= ChronoTimer <> :: duration(&someClass :: measuredF,end).count();' – xrep

+0

我假设'measuredF'不是静态的... – Jarod42

回答

2

您应该传递一个可调用对象,&someClass::measuredF不可调用,它需要一个someClass对象。

你可以这样做:

void someClass::someFunction() { 
    long int end = 10; 
    auto duration = ChronoTimer<>::duration([this](long int end) { this->measuredF(end); }, end).count(); 
} 

或者捕获所有:

void someClass::someFunction() { 
    long int end = 10; 
    auto duration = ChronoTimer<>::duration([=]() { this->measuredF(end); }).count(); 
} 
+0

不幸的是,这是行不通的,编译器在'this-> measuredF(end)'后面返回有关预期分号的错误,并且当我添加它时仍然有错误:'member reference base type'typename duration > :: rep' (又名'long long')不是一个结构或联盟 auto duration = ChronoTimer <> :: duration([this](long int end){this-> measuredF(end)},end).count();' – xrep

+0

嗨Jarod,我描述的最后一个错误与将duration_cast分配给auto有关。所以我终于搞定了。 Thx寻求帮助! – xrep