2015-10-19 86 views
0

我試圖編寫一個函數,允許用戶指定chrono::duration,如chrono::seconds並返回chrono::duration::count的結果。帶chrono :: duration參數並返回chrono :: duration :: count的函數的模板函數

我能夠做到這一點使用下面的模板函數:

template<typename D, typename Rep> 
Rep getTimeSinceStart(){ 
    return chrono::duration_cast<D>(chrono::steady_clock::now() - start).count(); 
    }; 

調用這個函數,我必須爲Rep指定類型。例如,假設我有一個名爲timer一個對象,如果Replong long

long long sinceStart = timer.getTimeSinceStart<chrono::seconds, long long>(); 

但是,有沒有辦法只有指定chrono::duration

我的想法是這樣的:

template<typename D> 
D.rep getTimeSinceStart(){ 
    return chrono::duration_cast<D>(chrono::steady_clock::now() - start).count(); 
}; 

這樣我可以只叫:

long long sinceStart = timer.getTimeSinceStart<chrono::seconds>(); 

回答

2

是這樣的:

#include <thread> 
#include <iostream> 
#include <chrono> 

const std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); 

template<typename D> 
typename D::rep getTimeSinceStart(){ 
    return std::chrono::duration_cast<D>(std::chrono::steady_clock::now() - start).count(); 
}; 

int main (int argc, char **argv) 
{ 
    std::this_thread::sleep_for(std::chrono::seconds(2)); 
    long long sinceStart = getTimeSinceStart<std::chrono::seconds>(); 
    std::cout << "since start: " << sinceStart << std::endl; 

} 

在上面的代碼,start是全球 - 你會想讓它成爲你班上的一員。

+0

太棒了!你可能可以告訴我相對比較新的模板。我不知道我需要在返回值的'D :: rep'之前指定'typename'。如果你有一個參考,我可以閱讀更多關於這一點,我會欣賞方向。 – user3731622

+1

深呼吸:http://en.cppreference.com/w/cpp/language/dependent_name –