Идиоматический способ проверить продолжительность std::chrono меньше 0

я знаю, что могу сделать это

if (timeLeft.count() < 0)

Но мне интересно, как лучше всего, поскольку я также мог бы сделать:

if (timeLeft<std::chrono::seconds(0)) // or milliseconds or nanonseconds...

примечание: я предполагаю, что обе проверки одинаковы, но я не эксперт по хронометрии.

изменить: полный пример:

#include<chrono>
int main(){
    const std::chrono::nanoseconds timeLeft(-5);
    if(timeLeft<std::chrono::seconds(0)){
        return 47;
    }
}

edit2: потенциальная проблема с std::chrono::seconds(0) заключается в том, что начинающий программист может предположить, что это связано с округлением, хотя это не так.


person NoSenseEtAl    schedule 05.10.2020    source источник
comment
что такое timeLeft ?   -  person 463035818_is_not_a_number    schedule 05.10.2020
comment
@idclev463035818 добавил полный пример.   -  person NoSenseEtAl    schedule 05.10.2020
comment
Обычно короче/простее лучше, включая IMO в этом случае, и да: ноль любой длительности хроно равен нулю в других, но я подозреваю, что это в конечном итоге основано на мнении. Лично я бы использовал более короткий/простой код и определенно не стал бы сравнивать nanoseconds с seconds, если в этом нет необходимости, поэтому if (timeLeft.count() < 0) кажется мне явным победителем.   -  person underscore_d    schedule 05.10.2020
comment
предполагая, что они эквивалентны, я бы выбрал timeLeft<std::chrono::seconds(0), потому что будет легче реорганизовать 0, например, в 42. Кстати они одинаковые? не основано на мнении, но в случае, если они одинаковы, спрашивают, что лучше? основано на мнении. Может быть, небольшая перефразировка поможет избежать закрытия вопроса   -  person 463035818_is_not_a_number    schedule 05.10.2020
comment
Всегда предпочитайте оставаться в системе типов хроно, а не избегать ее с помощью .count(), как показано в ответе Адама. И новичок должен скоро понять, что сравнения хронографов всегда точны. Действительно, в хроно все точно, пока вы не увидите явный именованный состав (duration_cast, time_point_cast, floor, ceil или round).   -  person Howard Hinnant    schedule 05.10.2020
comment
@HowardHinnant Я знаю, что он должен, но он будет;) Но, кроме шуток, я думаю, что вы правы ... в долгосрочной перспективе спасение его от изучения этого приносит больше вреда, чем пользы.   -  person NoSenseEtAl    schedule 05.10.2020


Ответы (1)


Один из способов выразить это — использовать литералы std::chrono::duration (https://en.cppreference.com/w/cpp/chrono/duration). Коротко и чисто:

#include<chrono>

int main(){
    using namespace std::chrono_literals;
    
    const auto timeLeft = -5ns;
    if(timeLeft<0s){
        return 47;
    }
}
person Adam    schedule 05.10.2020