我正在修改一个旧项目,同时更新了一些内容,使其升级到C++11。
我想用std::chrono中的新功能取代boost::date_time的各种用法。但是我不知道什么是C++11的boost::date_time::not_a_date_time。
在C++11中,难道没有一个等价物来指示time_point变量尚未被分配,或者不包含有效的时间戳吗?
给定它作为组的一部分存在的事实
bool is_infinity() const bool is_neg_infinity() const bool is_pos_infinity() const bool is_not_a_date_time() const
很明显,这是通过使用浮点类型作为内部表示并将值设置为NaN(非数字)来实现的。
在std::chrono
中,表示类型要求是算术类型。因此,浮点类型符合条件,您可以使用相同的技巧。
给定一个std::duration
,然后可以使用进行测试
std::isnan(dur.count())
(当然,您应该使用安静的NaN值,而不是信号NaN,这样就不会触发浮点陷阱)
boost::date_time
内部使用整数时间表示,并定义boost/date_time/int_adapter.hpp
:内部的特殊值
static const int_adapter pos_infinity()
{
return (::std::numeric_limits<int_type>::max)();
}
static const int_adapter neg_infinity()
{
return (::std::numeric_limits<int_type>::min)();
}
static const int_adapter not_a_number()
{
return (::std::numeric_limits<int_type>::max)()-1;
}
static int_adapter max BOOST_PREVENT_MACRO_SUBSTITUTION ()
{
return (::std::numeric_limits<int_type>::max)()-2;
}
static int_adapter min BOOST_PREVENT_MACRO_SUBSTITUTION ()
{
return (::std::numeric_limits<int_type>::min)()+1;
}
本质上,它保留某些整数值以具有特殊含义。
然而,正如其他人所指出的,std::chrono
不提供这些特殊值(只有min
和max
函数);并且CCD_ 8也不是专门化的(请参见为什么std::numeric_limits<seconds>::max()返回0?)。
Ben Voigt的回答提供了一个可能的解决方法,但请注意,由于std::chrono
类没有指定这样的语义,将NaN时间戳或持续时间交给任何您没有自己编写的函数都可能会触发未定义的行为。