我正在修改一个旧项目,同时我正在更新一些内容以将其升级到 C++11。
我想用 std::chrono 中的新功能替换 boost::date_time 的各种用途。但我无法弄清楚 boost::date_time::not_a_date_time 的 C++11 等价物是什么。
在 C++11 中是否没有等价的表示尚未分配 time_point 变量,或者不包含有效的时间戳?
我正在修改一个旧项目,同时我正在更新一些内容以将其升级到 C++11。
我想用 std::chrono 中的新功能替换 boost::date_time 的各种用途。但我无法弄清楚 boost::date_time::not_a_date_time 的 C++11 等价物是什么。
在 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
中,表示类型必须是算术类型。因此,浮点类型符合条件,您可以使用相同的技巧。
给定 a 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
功能);并且std::numeric_limits
也不是专门的(请参阅为什么 std::numeric_limits<seconds>::max() 返回 0?)。
Ben Voigt 的回答提出了一种可能的解决方法,但请注意,由于std::chrono
类未指定此类语义,因此将 NaN 时间戳或持续时间交给您自己未编写的任何函数可能会触发未定义的行为。