什么是C ++ 11相当于boost :: date_time :: not_a_date_time?

时间:2014-09-17 00:34:25

标签: c++ c++11 chrono boost-date-time

我正在修改一个旧项目,同时我还要更新几件事,以便将它带到C ++ 11。

我想用std :: chrono中的新功能替换boost :: date_time的各种用法。但我无法弄清楚什么是C ++ 11相当于boost :: date_time :: not_a_date_time。

在C ++ 11中是否存在等价物,表示尚未分配time_point变量,或者不包含有效的时间戳?

2 个答案:

答案 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时间戳或持续时间交给您自己未编写的任何函数可能会触发未定义的行为。