std::chrono::duration 整数难度

std::chrono::duration integer difficulties

我有这个简单的模板秒表计时器,我计划在我的下一个项目中使用它,每当我使用 "Timer< float >" 实例化这个 class 时一切正常,但是如果我使用 "Timer< int >" 我收到错误。

timer.h(18): error C2440: '' : cannot convert from 'std::chrono::duration<_Rep,_Period>' to 'std::chrono::duration<_Rep,_Period>'

我不知道为什么会这样,感谢大家的帮助,在此先感谢!

template< typename type > class Timer
{

public:

    void Start(){ m_Start = m_Time.now(); }
    void Reset(){ m_Start = m_Time.now(); m_Split = m_Start; }
    void Split(){ m_Split = m_Time.now(); }

    type HoursSinceStart()          { return std::chrono::duration< type, std::ratio< 3600 > >( m_Time.now() - m_Start ).count(); }
    type MinutesSinceStart()        { return std::chrono::duration< type, std::ratio< 60 > >( m_Time.now() - m_Start ).count(); }
    type SecondsSinceStart()        { return std::chrono::duration< type, std::ratio< 1 > >( m_Time.now() - m_Start ).count(); }
    type MilliSecondsSinceStart()   { return std::chrono::duration< type, std::milli >( m_Time.now() - m_Start ).count(); }
    type MicroSecondsSinceStart()   { return std::chrono::duration< type, std::micro >( m_Time.now() - m_Start ).count(); }
    type NanoSecondsSinceStart()    { return std::chrono::duration< type, std::nano >( m_Time.now() - m_Start ).count(); }

    type HoursSinceSplit()          { return std::chrono::duration< type, std::ratio< 3600 > >( m_Time.now() - m_Split ).count(); }
    type MinutesSinceSplit()        { return std::chrono::duration< type, std::ratio< 60 > >( m_Time.now() - m_Split ).count(); }
    type SecondsSinceSplit()        { return std::chrono::duration< type, std::ratio< 1 > >( m_Time.now() - m_Split ).count(); }
    type MilliSecondsSinceSplit()   { return std::chrono::duration< type, std::milli >( m_Time.now() - m_Split ).count(); }
    type MicroSecondsSinceSplit()   { return std::chrono::duration< type, std::micro >( m_Time.now() - m_Split ).count(); }
    type NanoSecondsSinceSplit()    { return std::chrono::duration< type, std::nano >( m_Time.now() - m_Split ).count(); }

private:

    std::chrono::high_resolution_clock m_Time;

    std::chrono::high_resolution_clock::time_point m_Start;
    std::chrono::high_resolution_clock::time_point m_Split;
};

chrono 库正在努力避免您在单位转换过程中意外丢失信息。例如,将 minutes 转换为 nanoseconds 总是可以的,因为 nanoseconds 总是可以准确表示任何数量的 minutes.

但是 nanoseconds 不会那么容易地转换为 minutes,因为这种转换是 "lossy"。转换不准确,会出现截断(舍入)错误。如果你真的想要这样的转换,你必须明确说明。这就是 std::chrono::duration_cast 的用途。例如:

minutes m = duration_cast<minutes>(ns);

这表示将 nanoseconds 转换为 minutes,并在剩余 nanoseconds.

时截断为零

此"safety net"仅适用于整数表示(例如int)。当您使用基于浮点的持续时间时,允许从 nanosecondsminutes 的隐式转换,因为浮点类型将表示来自 nanoseconds 左边的 minute 的分数.

如果您需要 "truncate towards zero" 以外的舍入模式,here 有一些实用程序可以做到这一点。