C++ chrono - получает длительность как float или long long

У меня есть продолжительность

typedef std::chrono::high_resolution_clock Clock;
Clock::time_point       beginTime;
Clock::time_point       endTime;
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - beginTime);

И я получаю duration в std::chrono::milliseconds, Но мне нужно duration как float или же long long, Как это сделать?

2 ответа

Решение

Из документации

template<
    class Rep, 
    class Period = std::ratio<1> 
> class duration;

Шаблон класса std:: chrono:: duration представляет временной интервал. Он состоит из числа тиков типа Rep и периода тиков, где период тиков - это рациональная постоянная времени компиляции, представляющая количество секунд от одного тика до следующего.

А также:

count возвращает количество тиков

Таким образом, длительность хранит количество тиков за определенный период времени, и count вернет это число, используя базовый тип представления. Так что, если представление продолжительности long longи период std::milli, затем .count() вернет long long равно числу миллисекунд, представленных длительностью.


В общем, вы должны избегать использования слабых типов, таких как float или же long long представлять продолжительность. Вместо этого вам следует придерживаться "богатых" типов, таких как std:: chrono:: milliseconds или соответствующей специализации std:: chrono:: duration. Эти типы помогают правильное использование и удобочитаемость, и помогают предотвратить ошибки с помощью проверки типов.

  • Не указано / чрезмерно общее:
    - void Increase_speed(double);
    - Объект объект; … Obj.draw();
    - Прямоугольник (int,int,int,int);

  • Лучше: - void Increase_speed(Speed);
    - Форма & s; … S.draw ();
    - прямоугольник (точка top_left, точка bottom_right);
    - Прямоугольник (точка top_left, Box_hw b);

- слайд 18 из выступления Бьярне


std::chrono является "согласованным подмножеством библиотеки физических величин, которая обрабатывает только единицы времени и только те единицы времени с показателями, равными 0 и 1".

Если вам нужно работать с большим количеством времени, вы должны воспользоваться этой библиотекой или библиотекой, которая предоставляет более полные системы единиц, такие как boost:: unit.

Есть редкие случаи, когда количества должны быть понижены до слабо типизированных значений. Например, когда нужно использовать API, который требует таких типов. В противном случае этого следует избегать.

Как float ответ.

std::chronos typedefs являются целочисленными. Тем не мение, duration класс может принять float,

См мой duration Определения типов:

https://github.com/faithandbrave/Shand/blob/master/shand/duration.hpp

...
template <class Rep>
using seconds_t = std::chrono::duration<Rep>;
using seconds_f = seconds_t<float>;
using seconds_d = seconds_t<double>;
using seconds_ld = seconds_t<long double>;

template <class Rep>
using minutes_t =  std::chrono::duration<Rep, std::ratio<60>>;
using minutes_f = minutes_t<float>;
using minutes_d = minutes_t<double>;
using minutes_ld = minutes_t<long double>;
...

Эти длительности использования здесь:

#include <iostream>
#include <shand/duration.hpp>

int main()
{
    std::chrono::seconds int_s(3);
    shand::minutes_f float_m = int_s; // without `duration_cast`

    std::cout << float_m.count() << std::endl; // 0.05
}
Другие вопросы по тегам