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
)。当您使用基于浮点的持续时间时,允许从 nanoseconds
到 minutes
的隐式转换,因为浮点类型将表示来自 nanoseconds
左边的 minute
的分数.
如果您需要 "truncate towards zero" 以外的舍入模式,here 有一些实用程序可以做到这一点。
我有这个简单的模板秒表计时器,我计划在我的下一个项目中使用它,每当我使用 "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
)。当您使用基于浮点的持续时间时,允许从 nanoseconds
到 minutes
的隐式转换,因为浮点类型将表示来自 nanoseconds
左边的 minute
的分数.
如果您需要 "truncate towards zero" 以外的舍入模式,here 有一些实用程序可以做到这一点。