2015-06-21 146 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