我有一个简单的模板秒表计时器,我计划在下一个项目中使用它,每当我使用"timer<float>"实例化这个类时,一切都很好,但如果我使用"定时器<int>",我会出错。
timer.h(18):错误C2440:":无法从"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
,因为这种转换是"有损的"。转换不准确,会有截断(舍入)错误。如果你真的想要这样的转换,你必须明确它。这就是std::chrono::duration_cast
的作用。例如:
minutes m = duration_cast<minutes>(ns);
这意味着将nanoseconds
转换为minutes
,并在剩下一些nanoseconds
时截断为零。
此"安全网"仅适用于积分表示(例如int
)。当您使用基于浮点的持续时间时,允许从nanoseconds
到minutes
的隐式转换,因为浮点类型将表示minute
的分数来自nanoseconds
的剩余部分。
如果您需要除"截断为零"之外的舍入模式,这里有一些实用程序可以做到这一点。