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)typename Period::type (начиная с C++17), std::ratio, представляющий период тика (т.е. количество долей секунды в тике)
|
Функции-элементы
| строит новый duration (public функция-элемент) | |
| присваивает содержимое (public функция-элемент) | |
| возвращает количество тиков (public функция-элемент) | |
[static] |
возвращает специальное нулевое значение длительности (public static функция-элемент) |
[static] |
возвращает специальное минимальное значение длительности (public static функция-элемент) |
[static] |
возвращает специальное максимальное значение длительности (public static функция-элемент) |
| реализует унарный + и унарный - (public функция-элемент) | |
| увеличивает или уменьшает количество тактов (public функция-элемент) | |
| реализует составное присваивание между двумя длительностями (public функция-элемент) |
Функции, не являющиеся элементами
| реализует арифметические операции с duration в качестве аргументов (шаблон функции) | |
(C++11)(C++11)(удалено в C++20)(C++11)(C++11)(C++11)(C++11)(C++20) |
сравнивает два duration (шаблон функции) |
(C++11) |
преобразует duration в другой duration с другим интервалом тиков (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя в меньшую сторону (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя в большую сторону (шаблон функции) |
(C++17) |
преобразует duration в другой, округляя до ближайшего, или до чётного в промежуточных случаях (шаблон функции) |
(C++17) |
получает абсолютное значение duration (шаблон функции) |
(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>>
|
Примечание: каждый из предопределённых типов duration до hours охватывает диапазон не менее ±292 лет.
|
Каждый из предопределённых типов duration |
(начиная с C++20) |
Вспомогательные классы
| специализация свойства std::common_type (специализация шаблона класса) | |
(C++11) |
указывает, что duration конвертируется в duration с другим периодом тика (шаблон класса) |
(C++11) |
строит нулевое, минимальное и максимальное значения счётчика тиков заданного типа (шаблон класса) |
поддержка форматирования для duration (специализация шаблона класса) | |
| поддержка хэширования для std::chrono::duration (специализация шаблона класса) |
Литералы
Определены в пространстве имён
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) |
Примечание
Фактический интервал времени (в секундах), удерживаемый объектом duration d, примерно равен d.count() * D::period::num / D::period::den, где D имеет тип chrono::duration<>, а d объект этого типа.
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_chrono_udls |
201304L |
(C++14) | Пользовательские литералы для типов времени |
Пример
В этом примере показано, как определить несколько настраиваемых типов duration и выполнить преобразование между типами:
#include <iostream>
#include <chrono>
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 секунда это:\n";
// преобразование целочисленного масштаба без потери точности: без приведения
std::cout << std::chrono::milliseconds(1s).count() << " миллисекунд\n"
<< std::chrono::microseconds(1s).count() << " микросекунд\n"
<< std::chrono::nanoseconds(1s).count() << " наносекунд\n";
// преобразование целочисленного масштаба с потерей точности: требуется приведение
std::cout << std::chrono::duration_cast<std::chrono::minutes>(1s).count()
<< " минут\n";
// преобразование масштаба с плавающей запятой: без приведения
std::cout << microfortnights(1s).count() << " microfortnights\n"
<< nanocenturies(1s).count() << " нановека\n"
<< fps_24(1s).count() << " кадра в 24fps\n";
}
Вывод:
1 секунда это:
1000 миллисекунд
1000000 микросекунд
1000000000 наносекунд
0 минут
0.82672 microfortnights
0.316887 нановека
24 кадра в 24fps