D.1.1. Шаблон класса std::chrono::duration

Шаблон класса std::chrono::duration предназначен для представления интервалов. Параметры шаблона Rep и Period — это соответственно тип данных для хранения значения интервала и конкретизация шаблона класса std::ratio, которая задает промежуток времени (в виде долей секунды) между последовательными «тиками». Например, std::chrono::duration<int, std::milli> определяет количество миллисекунд, представимое значением типа int, std::chrono::duration<short, std::ratio<1, 50>> — количество пятидесятых долей секунды, представимое значением типа short, а std::chrono::duration<long long, std::ratio<60, 1>> — количество минут, представимое значением типа long long.

Определение класса

template <class Rep, class Period = ratio<1> >

class duration {

public:

 typedef Rep rep;

 typedef Period period;

 constexpr duration() = default;

 ~duration() = default;

 duration(const duration&) = default;

 duration& operator=(const duration&) = default;

 template <class Rep2>

 constexpr explicit duration(const Rep2& r);

 template <class Rep2, class Period2>

 constexpr duration(const duration<Rep2, Period2>& d);

 constexpr rep count() const;

 constexpr duration operator+() const;

 constexpr duration operator-() const;

 duration& operator++();

 duration operator++(int);

 duration& operator--();

 duration operator--(int);

 duration& operator+=(const duration& d);

 duration& operator-=(const duration& d);

 duration& operator*=(const rep& rhs);

 duration& operator/=(const rep& rhs);

 duration& operator%=(const rep& rhs);

 duration& operator%=(const duration& rhs);

 static constexpr duration zero();

 static constexpr duration min();

 static constexpr duration max();

};

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator==(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator !=(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<=(

 const duration<Rep1, Period1>& lhs,

const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>=(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

template <class ToDuration, class Rep, class Period>

constexpr ToDuration duration_cast(

 const duration<Rep, Period>& d);

Требования

Rep должен быть встроенным числовым типом или определенным пользователем типом со свойствами числа. Period должен быть конкретизацией шаблона std::ratio<>.

STD::CHRONO::DURATION::REP, TYPEDEF

Это псевдоним типа для хранения числа тиков в значении duration.

Объявление

typedef Rep rep;

rep — тип значения, используемого для хранения внутреннего представления объекта duration.

STD::CHRONO::DURATION::PERIOD, TYPEDEF

Это псевдоним типа для конкретизации шаблона класса std::ratio, которая задает количество долей секунды, представляемых счетчиком интервала. Например, если period — это std::ratio<1, 50>, то объект duration, для которого count() равно N, представляет N пятидесятых долей секунды.

Объявление

typedef Period period;

STD::CHRONO::DURATION , КОНСТРУКТОР ПО УМОЛЧАНИЮ

Конструирует экземпляр std::chrono::duration со значением по умолчанию.

Объявление

constexpr duration() = default;

Результат

Внутреннее значение duration (типа rep) инициализируется значением по умолчанию.

STD::CHRONO::DURATION , КОНВЕРТИРУЮЩИЙ КОНСТРУКТОР ИЗ ЗНАЧЕНИЯ СЧЕТЧИКА

Конструирует экземпляр std::chrono::duration с заданным значением счетчика.

Объявление

template <class Rep2>

constexpr explicit duration(const Rep2& r);

Результат

Внутреннее значение объекта duration инициализируется значением static_cast<rep>(r).

Требования

Этот конструктор участвует в разрешении перегрузки, только если Rep2 может быть неявно преобразован в Rep, и либо Rep — тип с плавающей точкой, либо Rep2 не является типом с плавающей точкой.

Постусловие

this->count() == static_cast<rep>(r)

STD::CHRONO::DURATION , КОНВЕРТИРУЮЩИЙ КОНСТРУКТОР ИЗ ДРУГОГО ЗНАЧЕНИЯ STD::CHRONO::DURATION

Конструирует экземпляр std::chrono::duration, масштабируя значение счетчика другого объекта std::chrono::duration.

Объявление

template <class Rep2 , class Period2>

constexpr duration(const duration<Rep2, Period2>& d);

Результат

Внутреннее значение объекта duration инициализируется значением duration_cast<duration<Rep, Period>>(d).count().

Требования

Этот конструктор участвует в разрешении перегрузки, только если Rep — тип с плавающей точкой, либо Rep2 не является типом с плавающей точкой, и Period2 — целое кратное Period (то есть ratio_divide<Period2, Period>::den == 1). Это позволяет избежать случайного обрезания (и, значит, потери точности) при сохранении интервала с меньшим периодом в переменной, представляющий интервал с большим периодом.

Постусловие

this->count() == duration_cast<duration<Rep, Period>>(d).count()

Примеры

duration< int, ratio<1, 1000>> ms(5); ← 5 миллисекунд

duration<int, ratio<1,1>> s(ms);←┐ Ошибка: нельзя

                                 │ сохранить мс как

                                 │ целые секунды

duration<double, ratio<1, 1>> s2(ms);←┐ Правильно:

                                      │ s2.count() == 0.005

duration<int, ratio<1, 1000000>> us(ms);←┐ Правильно:

                                         │ us.count() == 5000

STD::CHRONO::DURATION::COUNT , ФУНКЦИЯ-ЧЛЕН

Получает значение интервала.

Объявление

constexpr rep count() const;

Возвращаемое значение

Внутреннее значение объекта duration в виде значения типа rep.

STD::CHRONO::DURATION::OPERATOR+ , УНАРНЫЙ ОПЕРАТОР ПЛЮС

Пустая операция, возвращает копию *this.

Объявление

constexpr duration operator+() const;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR- , УНАРНЫЙ ОПЕРАТОР МИНУС

Возвращает интервал, в котором значение count() противоположно значению this->count().

Объявление

constexpr duration operator-() const;

Возвращаемое значение

duration(-this->count());

STD::CHRONO::DURATION::OPERATOR++ , ОПЕРАТОР ПРЕДИНКРЕМЕНТА

Инкрементирует внутренний счетчик.

Объявление

duration& operator++();

Результат

++this->internal_count;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR++ , ОПЕРАТОР ПОСТИНКРЕМЕНТА

Инкрементирует внутренний счетчик и возвращает то значение *this, которое предшествовало выполнению операции.

Объявление

duration operator++(int);

Результат

duration temp(*this);

++(*this);

return temp;

STD::CHRONO::DURATION::OPERATOR-- , ОПЕРАТОР ПРЕДЕКРЕМЕНТА

Декрементирует внутренний счетчик.

Объявление

duration& operator--();

Результат

--this->internal_count;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR-- , ОПЕРАТОР ПОСТДЕКРЕМЕНТА

Декрементирует внутренний счетчик и возвращает то значение *this, которое предшествовало выполнению операции.

Объявление

duration operator--(int);

Результат

duration temp(*this);

--(*this);

return temp;

STD::CHRONO::DURATION::OPERATOR+= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Прибавляет счетчик другого объекта duration к внутреннему счетчику *this.

Объявление

duration& operator+=(duration const& other);

Результат

internal_count += other.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR-= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Вычитает счетчик другого объекта duration из внутреннего счетчика *this.

Объявление

duration& operator-=(duration const& other);

Результат

internal_count-=other.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR*= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Умножает внутренний счетчик *this на заданное значение.

Объявление

duration& operator*=(rep const& rhs);

Результат

internal_count*=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR/= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Делит внутренний счетчик *this на заданное значение.

Объявление

duration& operator/=(rep const& rhs);

Результат

internal_count/=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR%= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Записывает во внутренний счетчик *this остаток от его деления на заданное значение.

Объявление

duration& operator%=(rep const& rhs);

Результат

internal_count%=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR%= , СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Записывает во внутренний счетчик *this остаток от его деления на счетчик в другом объекте duration.

Объявление

duration& operator%=(duration const& rhs);

Результат

internal_count %= rhs.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::ZERO , СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект duration, представляющий значение нуль.

Объявление

constexpr duration zero();

Возвращаемое значение

duration(duration_values<rep>::zero());

STD::CHRONO::DURATION::MIN , СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект duration, представляющий минимально возможное для данной конкретизации значение.

Объявление

constexpr duration min();

Возвращаемое значение

duration(duration_values<rep>::min());

STD::CHRONO::DURATION::MAX , СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект duration, представляющий максимально возможное для данной конкретизации значение.

Объявление

constexpr duration max();

Возвращаемое значение

duration(duration_values<rep>::max());

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ НА РАВЕНСТВО

Сравнивает два объекта duration на равенство, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator==(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями duration, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Результат

Если CommonDuration — синоним std::common_type<duration<Rep1, Period1>, duration<Rep2, Period2>>::type, to lhs==rhs возвращает CommonDuration(lhs).count() == CommonDuration(rhs).count().

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ НА НЕРАВЕНСТВО

Сравнивает два объекта duration на неравенство, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator!=(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразовала в другую или они являются различными представлениями duration, но каждая может быть неявно преобразовала в другую, то выражение построено некорректно.

Возвращаемое значение

!(lhs == rhs)

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ

Проверяет, что один объект duration меньше другого, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями duration, по каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Результат

Если CommonDuration — синоним std::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type, то lhs<rhs возвращает CommonDuration(lhs).count() < CommonDuration(rhs).count().

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ

Проверяет, что один объект duration больше другого, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями duration, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!((rhs<lhs)||(rhs==lhs))

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ ИЛИ РАВНО

Проверяет, что один объект duration меньше или равен другому, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator<=(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразовала в другую или они являются различными представлениями duration, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!(rhs>lhs)

STD::CHRONO::DURATION , ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ ИЛИ РАВНО

Проверяет, что один объект duration больше или равен другому, даже если они имеют разные представления и (или) периоды.

Объявление

template <class Rep1, class Period1, class Rep2, class Period2>

constexpr bool operator>=(

 const duration<Rep1, Period1>& lhs,

 const duration<Rep2, Period2>& rhs);

Требования

Либо для lhs определено неявное преобразование в rhs, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями duration, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!(lhs<rhs)

STD::CHRONO::DURATION_CAST , ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Явно преобразует объект std::chrono::duration в заданную конкретизацию std::chrono::duration.

Объявление

template <class ToDuration, class Rep, class Period>

constexpr ToDuration duration_cast(

 const duration<Rep, Period>& d);

Требования

ToDuration должен быть конкретизацией std::chrono::duration.

Возвращаемое значение

Значение d, преобразованное к типу интервала, заданного параметром ToDuration. При выполнении операции минимизируется потеря точности в результате преобразования интервалов с разными масштабами и типами представления.