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 является частью типа длительности и используется только при преобразовании между разными длительностями.
Типы-члены
| Тип-член | Определение |
|---|---|
rep |
Rep — арифметический тип или класс, имитирующий арифметический тип и представляющий количество тактов |
period |
Period(до C++17 включительно)typenamePeriod::type(начиная с C++17), std::ratio, представляющее период такта (то есть количество долей секунды на такт) |
Функции-члены
| создаёт новую длительность (открытая функция-член) |
|
| присваивает содержимое (открытая функция-член) |
|
| возвращает количество тактов (открытая функция-член) |
|
|
[static] | возвращает специальное значение длительности — ноль (открытая статическая функция-член) |
|
[static] | возвращает специальное минимальное значение длительности (открытая статическая функция-член) |
|
[static] | возвращает специальное максимальное значение длительности (открытая статическая функция-член) |
| реализует унарные операторы + и - (открытая функция-член) |
|
| увеличивает или уменьшает количество тактов (открытая функция-член) |
|
| реализует составное присваивание для двух длительностей (открытая функция-член) |
Функции вне класса
|
(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) | разбирает duration из потока в соответствии с заданным форматом (шаблон функции) |
Вспомогательные типы
Тип /* intXX */, используемый в таблице ниже, означает знаковый целочисленный тип шириной не менее XX бит.
| Тип | Определение |
|---|---|
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 (специализация шаблона класса) |
Вспомогательные специализации
template< class Rep, class Period >
constexpr bool enable_nonlocking_formatter_optimization<chrono::duration<Rep, Period>>
= enable_nonlocking_formatter_optimization<Rep>;
| (начиная с C++23) |
Эта специализация std::enable_nonlocking_formatter_optimization обеспечивает эффективную реализацию std::print и std::println для вывода объекта chrono::duration, если параметр шаблона Rep включает такую возможность.
Литералы
Определены во встроенном пространстве имён std::literals::chrono_literals |
|
|---|---|
|
(C++14) | литерал std::chrono::duration, представляющий часы (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий минуты (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий секунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий миллисекунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий микросекунды (функция) |
|
(C++14) | литерал std::chrono::duration, представляющий наносекунды (функция) |
| Примечание: суффиксы литералов | (начиная с 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";
// alternative to duration_cast:
std::cout << 1s / 1min << " 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 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/cpp/chrono/duration