Namespaces
Variants

std::chrono:: duration

From cppreference.net
Определено в заголовке <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) typename Period :: type (начиная с C++17) , std::ratio представляющий период тика (т.е. количество долей секунды на тик)

Функции-члены

создает новый duration
(public member function)
присваивает содержимое
(public member function)
возвращает количество тиков
(public member function)
[static]
возвращает специальное значение duration zero
(public static member function)
[static]
возвращает специальное значение duration min
(public static member function)
[static]
возвращает специальное значение duration max
(public static member function)
реализует унарные + и -
(public member function)
увеличивает или уменьшает количество тиков
(public member function)
реализует составное присваивание между двумя duration
(public member function)

Функции, не являющиеся членами класса

реализует арифметические операции с duration в качестве аргументов
(шаблон функции)
(C++11) (C++11) (удалено в C++20) (C++11) (C++11) (C++11) (C++11) (C++20)
сравнивает два duration
(шаблон функции)
преобразует duration в другой с другим интервалом тиков
(шаблон функции)
преобразует duration в другой с округлением вниз
(шаблон функции)
преобразует duration в другой с округлением вверх
(шаблон функции)
преобразует duration в другой с округлением к ближайшему, при равенстве к чётному
(шаблон функции)
получает абсолютное значение duration
(шаблон функции)
(C++20)
выполняет потоковый вывод для duration
(шаблон функции)
парсит 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 года.

Каждый из предопределенных типов длительности days , weeks , months и years охватывает диапазон как минимум ±40000 лет. years равен 365.2425 days (средняя продолжительность григорианского года). months равен 30.436875 days (ровно 1/12 от years ).

(начиная с C++20)

Вспомогательные классы

специализирует std::common_type трейт
(специализация шаблона класса)
указывает, что duration конвертируем в duration с другим периодом тиков
(шаблон класса)
создает нулевое, минимальное и максимальное значения счетчика тиков заданного типа
(шаблон класса)
поддержка форматирования для duration
(специализация шаблона класса)
поддержка хеширования для 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
литерал std::chrono::duration представляющий часы
(функция)
литерал std::chrono::duration представляющий минуты
(функция)
литерал std::chrono::duration представляющий секунды
(функция)
литерал std::chrono::duration представляющий миллисекунды
(функция)
литерал std::chrono::duration представляющий микросекунды
(функция)
литерал std::chrono::duration представляющий наносекунды
(функция)

Примечание: литеральные суффиксы d и y относятся не к days и years , а к day и year соответственно.

(начиная с 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