std::chrono::duration
Определено в заголовочном файле <chrono> | ||
|---|---|---|
template<
class Rep,
class Period = std::ratio<1>
> class duration;
| (с C++11) |
Шаблон класса std::chrono::duration представляет собой интервал времени.
Он состоит из счётчика тиков типа Rep и периода тика, где период тика — рациональное число в формате времени компиляции fraction, представляющее время в секундах между двумя соседними тиками.
В duration хранится только счётчик тиков типа Rep. Если Rep — тип с плавающей точкой, то duration может представлять дробные части тиков. Period включён в тип duration и используется только при преобразовании между разными интервалами времени.
Типы членов
| Тип члена | Определение |
|---|---|
rep | Rep, арифметический тип, представляющий количество тиков |
period | Period(до C++17)typename Period::type(с C++17), std::ratio, представляющий период тика (т. е. количество долей секунды на один тик) |
Члены-функции
| создаёт новый интервал времени (публичная функция-член) |
|
| присваивает содержимое (публичная функция-член) |
|
| возвращает количество тиков (публичная функция-член) |
|
|
[статический] | возвращает специальное значение нулевого интервала времени (публичная статическая функция-член) |
|
[статический] | возвращает специальное значение минимального интервала времени (публичная статическая функция-член) |
|
[статический] | возвращает специальное значение максимального интервала времени (публичная статическая функция-член) |
| реализует унарные + и - (публичная функция-член) |
|
| увеличивает или уменьшает количество тиков (публичная функция-член) |
|
| реализует сложные операции присваивания между двумя интервалами времени (публичная функция-член) |
Внешние функции
|
(C++11) | реализует арифметические операции с интервалами времени в качестве аргументов (шаблон функции) |
|
(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20) | сравнивает два интервала времени (шаблон функции) |
|
(C++11) | преобразует интервал времени в другой с другим периодом тика (шаблон функции) |
|
(C++17) | преобразует интервал времени в другой, округляя вниз (шаблон функции) |
|
(C++17) | преобразует интервал времени в другой, округляя вверх (шаблон функции) |
|
(C++17) | преобразует интервал времени в другой, округляя до ближайшего целого, при равенстве округляет до чётного (шаблон функции) |
|
(C++17) | возвращает абсолютное значение интервала времени (шаблон функции) |
|
(C++20) | выполняет вывод в поток для duration (шаблон функции) |
|
(C++20) | парсит интервал времени из потока в соответствии с заданным форматом (шаблон функции) |
Вспомогательные типы
Тип /* intXX */ в таблице ниже означает целые числа со знаком, занимающие не менее XX битов.
END_OF_DOCUMENT_MARKER| Тип | Определение |
|---|---|
std::chrono::nanoseconds | std::chrono::duration</* int64 */, std::nano> |
std::chrono::microseconds | std::chrono::duration</* int55 */, std::micro> |
std::chrono::milliseconds | std::chrono::duration</* int45 */, std::milli> |
std::chrono::seconds | std::chrono::duration</* int35 */> |
std::chrono::minutes | std::chrono::duration</* int29 */, std::ratio<60>> |
std::chrono::hours | std::chrono::duration</* int23 */, std::ratio<3600>> |
std::chrono::days (с C++20) | std::chrono::duration</* int25 */, std::ratio<86400>> |
std::chrono::weeks (с C++20) | std::chrono::duration</* int22 */, std::ratio<604800>> |
std::chrono::months (с C++20) | std::chrono::duration</* int20 */, std::ratio<2629746>> |
std::chrono::years (с C++20) | std::chrono::duration</* int17 */, std::ratio<31556952>> |
Примечание: каждый из предопределённых типов продолжительности до hours охватывает диапазон не менее ±292 лет.
| Каждый из предопределенных типов продолжительности | (с C++20) |
Классы-помощники
|
(C++11) | специализирует std::common_type предикат (специализация шаблона класса) |
|
(C++11) | указывает, что продолжительность может быть преобразована в продолжительность с другим периодом отсчета (шаблон класса) |
|
(C++11) | создаёт нулевое, минимальное и максимальное значения счётчика отсчётов заданного типа (шаблон класса) |
|
(C++20) | поддержка форматирования для duration (специализация шаблона класса) |
|
(C++26) | поддержка хеширования для std::chrono::duration (специализация шаблона класса) |
Литералы
Определено в встроенном именованном пространстве std::literals::chrono_literals |
|
|---|---|
|
(C++14) | литерал, представляющий часы (функция) |
|
(C++14) | литерал, представляющий минуты (функция) |
|
(C++14) | литерал, представляющий секунды (функция) |
|
(C++14) | литерал, представляющий миллисекунды (функция) |
|
(C++14) | литерал, представляющий микросекунды (функция) |
|
(C++14) | литерал, представляющий наносекунды (функция) |
| Примечание: постфиксы литералов | (с C++20) |
Примечания
Фактический интервал времени (в секундах), хранимый объектом продолжительности d, приблизительно равен d.count() * D::period::num / D::period::den, где D имеет тип chrono::duration<>, а d — объект такого типа.
| Макрокоманда проверки возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_chrono_udls | 201304L | (C++14) | Пользовательские литералы для типов времени |
Пример
Этот пример демонстрирует, как определить несколько типов пользовательской длительности и конвертировать между ними:
#include <chrono>
#include <iostream>
using namespace std::chrono_literals;
template<typename T1, typename T2>
using mul = std::ratio_multiply<T1, T2>;
int main()
{
using microfortnights = std::chrono::duration<float,
mul<mul<std::ratio<2>, std::chrono::weeks::period>, std::micro>>;
using nanocenturies = std::chrono::duration<float,
mul<mul<std::hecto, std::chrono::years::period>, std::nano>>;
using fps_24 = std::chrono::duration<double, std::ratio<1, 24>>;
std::cout << "1 second is:\n";
// integer scale conversion with no precision loss: no cast
std::cout << std::chrono::milliseconds(1s).count() << " milliseconds\n"
<< std::chrono::microseconds(1s).count() << " microseconds\n"
<< std::chrono::nanoseconds(1s).count() << " nanoseconds\n";
// integer scale conversion with precision loss: requires a cast
std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
<< " minutes\n";
// floating-point scale conversion: no cast
std::cout << microfortnights(1s).count() << " microfortnights\n"
<< nanocenturies(1s).count() << " nanocenturies\n"
<< fps_24(1s).count() << " frames at 24fps\n";
}Вывод:
1 second is: 1000 milliseconds 1000000 microseconds 1000000000 nanoseconds 0 minutes 0.82672 microfortnights 0.316887 nanocenturies 24 frames at 24fps
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/chrono/duration