2015-10-19 70 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 –

相关问题