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::chrono
s 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
}