2016-02-18 138 views
5

http://en.cppreference.com/w/cpp/chrono的实例中,秒数值在double中获得。这是我想要的行为。然而,这似乎依赖于隐含的假设,即时间点减法产生代表秒的值。我找不到任何解释为什么一个持续时间在没有实际指定时间单位的情况下产生浮点秒的原因。完全不使用auto,有人可以展示如何明确获取浮点类型中的时间单位(例如秒),还是指向文档或解释为什么上述转换表示秒?获得计时秒数

有问题的转换基本上是:

std::chrono::time_point<std::chrono::system_clock> start = std::chrono::system_clock::now(); 
std::chrono::time_point<std::chrono::system_clock> end = std::chrono::system_clock::now(); 
std::chrono::duration<double> elapsed_seconds = end-start; // why does this represent seconds as opposed to some other time unit? 
double secondsInDouble = elapsed_seconds.count(); 

请参阅以下职位转换的例子。

How to get duration, as int milli's and float seconds from <chrono>?

C++ chrono - get duration as float or long long

getting chrono time in specific way

Chrono Timer Not Converting Seconds Properly

回答

5

根据该:http://en.cppreference.com/w/cpp/chrono/duration用于第二模板参数缺省比值是1:1含义秒。

其他值是相对于该值的比率。例如,对于std::chrono::milliseconds的比率为1:1000http://en.cppreference.com/w/cpp/numeric/ratio/ratio

因此该语句:

std::chrono::duration<double> elapsed_seconds = end-start; 

相当于:

std::chrono::duration<double, std::ratio<1>> elapsed_seconds = end-start; 

其被定义为从其中所有其它比率导出秒。

无论单元end - start在GET转换为std::ratio<1>定义。

如果你想以毫秒为单位的时间,你可以这样做:

std::chrono::duration<double, std::ratio<1, 1000>> elapsed_milliseconds = end-start; 

而且end - start应根据新的比例转换。

+0

我在参考文献的顶部看到了我错过的部分:'tick周期是编译时有理常量,表示从一个刻度到下一个刻度的秒数。“因此,默认比例为1:1,持续时间总是代表一秒钟。感谢您将这引起我的注意。 – taz

+2

'std :: ratio <1, 1000>'可以替换为'std :: milli'。 –