Я изменяю старый проект, и в то же время я обновляю несколько вещей, чтобы привести его к C ++ 11.
Я хотел бы заменить различные применения boost :: date_time на новую функциональность в std :: chrono. Но я не могу понять, что в 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
функции); а также std::numeric_limits
также не специализируется (см. Почему std :: numeric_limits<секунд>:: max () вернуть 0?).
Ответ бен фойгта представляет возможный обходной путь, но имейте в виду, что, так как std::chrono
классы не задают такую семантику, так как передача временной метки или длительности NaN какой-либо функции, которую вы не написали самостоятельно, вероятно, вызовет неопределенное поведение.