std::chrono::duration整数困难



我有一个简单的模板秒表计时器,我计划在下一个项目中使用它,每当我使用"timer<float>"实例化这个类时,一切都很好,但如果我使用"定时器<int>",我会出错。

timer.h(18):错误C2440:":无法从"std::chrono::duration&lt_Rep,_Period>'to'std::chrono::duration&lt_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,因为这种转换是"有损的"。转换不准确,会有截断(舍入)错误。如果你真的想要这样的转换,你必须明确它。这就是std::chrono::duration_cast的作用。例如:

minutes m = duration_cast<minutes>(ns);

这意味着将nanoseconds转换为minutes,并在剩下一些nanoseconds时截断为零。

此"安全网"仅适用于积分表示(例如int)。当您使用基于浮点的持续时间时,允许从nanosecondsminutes的隐式转换,因为浮点类型将表示minute的分数来自nanoseconds的剩余部分。

如果您需要除"截断为零"之外的舍入模式,这里有一些实用程序可以做到这一点。

最新更新