我正在修改一个旧项目,同时我还要更新几件事,以便将它带到C ++ 11。
我想用std :: chrono中的新功能替换boost :: date_time的各种用法。但我无法弄清楚什么是C ++ 11相当于boost :: date_time :: not_a_date_time。
在C ++ 11中是否存在等价物,表示尚未分配time_point变量,或者不包含有效的时间戳?
答案 0 :(得分:1)
鉴于它作为一个群体的一部分而存在
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,所以你不要触发浮点陷阱)
答案 1 :(得分:1)
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
and max
functions); std::numeric_limits
也不专业(见Why does std::numeric_limits<seconds>::max() return 0?)。
Ben Voigt's answer提供了一种可能的解决方法,但请注意,由于std::chrono
类没有指定此类语义,因此将NaN时间戳或持续时间交给您自己未编写的任何函数可能会触发未定义的行为。