如何将std :: chrono :: duration <double,std :: milli>转换为double

时间:2016-08-26 05:56:29

标签: c++11

我发现std::chrono有点混乱和阻碍。我想使用实值毫秒,最终得到的值为0.7或6.45或13.3,我可以将其视为double值。

我真的只想从两个time_point值开始,并将它们之间的经过时间作为double返回。怎么样?这不起作用:

using std;
using std::chrono;
high_resolution_clock::time_point t1( high_resolution_clock::now() );
// spend some time doing something...
high_resolution_clock::time_point t2( high_resolution_clock::now() );
const duration<double,milli> elapsedTime( t2 - t1 );
const double timeAsDouble( static_cast<double>( elapsedTime ) ); // no conversion available :-(
// go on to use or return timeAsDouble;

重要约束:我特别想要使用std::chrono::duration<double,std::milli>类型的值。为什么不?因为我会立即对我想要使用的值进行平方。当我对double进行平方时,我知道它是一个泛型类型,这意味着它只关注数字,而不是单位。因此,我必须自己明确地处理这些单元(例如,通过在变量名中明确它,即使这很容易出现滑落)。

但是,如果我想对std::chrono::duration<double,std::milli>进行定位,我会打开一堆关于单位的蠕虫或编码清晰度。在任何情况下,没有定义*运算符用于将此类本身相乘,因此下面示例中的第二行通过根本不编译来避免有关其单位和类型的问题:

auto timeSpan( duration<double,std::milli>( 0.8 ) );
auto spanSquared( timeSpan*timeSpan );    // ???

那么将看起来应该是double ...的简单方法改为double是什么?

1 个答案:

答案 0 :(得分:1)

也许您正在寻找std::chrono::duration<...>::count()

另外,值得一提的是,乘法运算符缺失的原因非常明显:当你乘以值时,你也可以乘以单位,例如: 10秒x 10秒= 100 square 。其中,导致了大量的问题,例如单位转换(例如 1平方秒= 1000000平方毫秒,而不是1000),这远远超出了std :: chrono的意图范围对