2016-02-18 2 views
5

В примере на http://en.cppreference.com/w/cpp/chrono значение секунд получено в double. Это поведение, которое я хочу. Однако, похоже, это полагается на неявное предположение, что вычитание момента времени дает значение, которое представляет секунды. Я не могу найти ничего, что объясняет, почему длительность дает секунды с плавающей запятой, когда на самом деле не указаны единицы времени. Не используя auto, может ли кто-нибудь показать, как явно получить единицу времени, например, секунды в типе с плавающей точкой, или указать мне на документацию или объяснение, почему вышеупомянутое преобразование представляет секунды?Получите хроно-секунды в поплавке

Конверсия в вопросе по существу:

std::chrono::time_point<std::chrono::system_clock> start = std::chrono::system_clock::now(); 
std::chrono::time_point<std::chrono::system_clock> end = std::chrono::system_clock::now(); 
std::chrono::duration<double> elapsed_seconds = end-start; // why does this represent seconds as opposed to some other time unit? 
double secondsInDouble = elapsed_seconds.count(); 

Смотрите следующие сообщения примеры преобразования.

How to get duration, as int milli's and float seconds from <chrono>?

C++ chrono - get duration as float or long long

getting chrono time in specific way

Chrono Timer Not Converting Seconds Properly

ответ

5

В соответствии с этим: http://en.cppreference.com/w/cpp/chrono/duration отношение по умолчанию для второго параметра шаблона является 1:1 смысл секунд.

Другие значения являются отношениями относительно этого. Например, отношение для std::chrono::milliseconds является 1:1000http://en.cppreference.com/w/cpp/numeric/ratio/ratio

Так это утверждение:

std::chrono::duration<double> elapsed_seconds = end-start; 

эквивалентно:

std::chrono::duration<double, std::ratio<1>> elapsed_seconds = end-start; 

, который определяется как секунд, из которой получены все другие соотношения.

Независимо от единиц end - start определены в преобразовании в std::ratio<1>, как в секунд.

Если вы хотите время в миллисекундах, вы могли бы сделать:

std::chrono::duration<double, std::ratio<1, 1000>> elapsed_milliseconds = end-start; 

И end - start должны быть преобразованы в соответствии с новым соотношением.

+0

Я вижу часть, которую я пропустил в верхней части ссылки: «период тика - это рациональная константа времени компиляции, представляющая количество секунд от одного тика до следующего». Поэтому, учитывая соотношение по умолчанию 1: 1, период длительности всегда составляет одну секунду. Спасибо, что привлек это к моему вниманию. – taz

+2

'std :: ratio <1, 1000>' можно заменить на 'std :: milli'. –

Смежные вопросы