std :: chrono :: duration integer困难

时间:2015-03-19 15:46:02

标签: c++11 chrono

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

  

timer.h(18):错误C2440:'':无法转换为'std :: chrono :: duration< _Rep,_Period>'到'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;
};

1 个答案:

答案 0 :(得分:2)

chrono库试图避免您在单位转换期间意外丢失信息。例如,将minutes转换为nanoseconds始终可以,因为nanoseconds始终可以精确地表示任意数量的minutes

nanoseconds不会轻易转换为minutes,因为这种转换是“有损”的。转换不准确,它会有截断(舍入)错误。如果你真的想要这样的转换,你必须明确它。这是std::chrono::duration_cast的用途。例如:

minutes m = duration_cast<minutes>(ns);

这表示将nanoseconds转换为minutes,并在剩余nanoseconds时将其截断为零。

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

如果您需要除“截断为零”之外的舍入模式,here是一些实用程序。