c++11 - 如何将 std::chrono::duration<double,std::milli> 转换为 double

标签 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> 进行平方,我会在单位或代码清晰度方面打开一 jar 蠕虫。无论如何,没有定义 * 运算符来将此类与其自身相乘,因此下面示例中的第二行通过根本不编译来避免有关其单位和类型的问题:

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

那么,将看起来应该是 double ... 的内容转换为 double 的简单方法是什么?

最佳答案

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

此外,值得一提的是,缺少乘法运算符的原因非常明显:当您乘以值时,您也会乘以单位,例如10 秒 x 10 秒 = 100 平方。这反过来会导致无数问题,例如单位转换(例如1平方秒= 1000000平方毫秒,而不是1000),这远远超出了 std::chrono 的预期范围对于。

关于c++11 - 如何将 std::chrono::duration<double,std::milli> 转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39159199/

相关文章:

python - 将 C++ boost::variant 暴露给 Python 时出错

c++ - 默认情况下是否创建 move 构造函数?

c++ - token "<"之前的错误预期标识符

c++ - 防止 std::atomic 溢出

c++ - 我能以某种方式不写出完整的限定返回类型名称吗?

c++ - 实现昂贵的 C++ 迭代器

c++ - c++11 有类似 quint8 的东西吗?

c++ - 将函数指针及其参数作为 thrust::tuple 传递给全局函数

c++ - std::bind 涉及到临时类拷贝时的模板推导

c++ - 比较两个map::iterators:为什么需要std::pair的拷贝构造函数?