Что такое C ++ 11, эквивалентный boost :: date_time :: not_a_date_time?

Я изменяю старый проект, и в то же время я обновляю несколько вещей, чтобы привести его к C ++ 11.

Я хотел бы заменить различные применения boost :: date_time на новую функциональность в std :: chrono. Но я не могу понять, что в C ++ 11 эквивалентно boost :: date_time :: not_a_date_time.

Разве в C ++ 11 нет эквивалента, который бы указывал, что переменная time_point еще не была назначена или не содержит допустимой метки времени?

2

Решение

Учитывая тот факт, что он существует как часть группы

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

Другие решения

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 какой-либо функции, которую вы не написали самостоятельно, вероятно, вызовет неопределенное поведение.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector