operator+,-,*,/,%(std::chrono::duration)
Материал из cppreference.com
<tbody>
</tbody>
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator+( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); |
(1) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator-( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); |
(2) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator*( const duration<Rep1,Period>& d, const Rep2& s ); |
(3) | |
template< class Rep1, class Rep2, class Period > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator*( const Rep1& s, const duration<Rep2,Period>& d ); |
(4) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator/( const duration<Rep1,Period>& d, const Rep2& s ); |
(5) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<Rep1,Rep2>::type constexpr operator/( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); |
(6) | |
template< class Rep1, class Period, class Rep2 > duration<typename std::common_type<Rep1,Rep2>::type, Period> constexpr operator%( const duration<Rep1, Period>& d, const Rep2& s ); |
(7) | |
template< class Rep1, class Period1, class Rep2, class Period2 > typename std::common_type<duration<Rep1,Period1>, duration<Rep2,Period2>>::type constexpr operator%( const duration<Rep1,Period1>& lhs, const duration<Rep2,Period2>& rhs ); |
(8) | |
Выполняет основные арифметические операции между двумя длительностями или между длительностью и числом тиков.
1) Преобразует две длительности в их общий тип и создаёт длительность, количество тиков которой представляет собой сумму счётчиков тиков после преобразования.
2) Преобразует две длительности в их общий тип и создаёт длительность, число тиков которой равно количеству тиков
rhs, вычтенному из количества тиков lhs после преобразования.3,4) Преобразует длительность
d в длительность, у которой rep является общим типом между Rep1 и Rep2, и умножает количество тиков после преобразования на s.
Эти перегрузки участвуют в разрешении перегрузки, только если s можно преобразовать в typename std::common_type<Rep1, Rep2>::type.5) Преобразует длительность
d в длительность rep, которая является общим типом между Rep1 и Rep2, делит количество тиков после преобразования на s. Эта перегрузка участвует в разрешении перегрузки, только если s преобразуется в typename std::common_type<Rep1, Rep2>::type, а Rep2 не является специализацией duration.6) Преобразует две длительности в их общий тип и делит количество тиков
lhs после преобразования на количество тиков rhs после преобразования. Обратите внимание, что возвращаемое значение этого оператора не является длительностью.7) Преобразует продолжительность
d в длительность, у которой rep является общим типом между Rep1 и Rep2, и создаёт длительность, количество тиков которой является остатком от деления счётчика тиков после преобразования на s. Эта перегрузка участвует в разрешении перегрузки, только если s преобразуется в typename std::common_type<Rep1, Rep2>::type, а Rep2 не является специализацией duration.8) Преобразует две длительности в их общий тип и создаёт длительность, счётчик тиков которой является остатком от счетчика тиков после преобразования.
Параметры
| lhs | — | длительность слева от оператора |
| rhs | — | длительность справа от оператора |
| d | — | аргумент длительности для операторов со смешанными аргументами |
| s | — | аргумент не длительность для операторов со смешанными аргументами |
Возвращаемое значение
Предполагая, что CD является типом возвращаемого значения функции и CD<A, B> = std::common_type<A, B>::type, тогда:
1)
CD(CD(lhs).count() + CD(rhs).count())2)
CD(CD(lhs).count() - CD(rhs).count())3,4)
CD(CD(d).count() * s) 5)
CD(CD(d).count() / s).6)
CD(lhs).count() / CD(rhs).count() (возвращаемый тип этого оператора не является длительностью)7)
CD(CD(d).count() % s)8)
CD(CD(lhs).count() % CD(rhs).count())
Пример
Запустить этот код
#include <chrono>
#include <iostream>
int main()
{
// Простая арифметика:
std::chrono::seconds s = std::chrono::hours(1)
+ 2*std::chrono::minutes(10)
+ std::chrono::seconds(70)/10;
std::cout << "1 час + 2*10 минут + 70/10 секунд = " << s << " (секунд)\n";
using namespace std::chrono_literals;
// Разница между делением длительности на число и делением
// длительности на другую длительность
std::cout << "Разделив это на 2 минуты, получим "
<< s / 2min << '\n'
<< "Разделив это на 2, получим "
<< (s / 2).count() << " секунды\n";
// Оператор остатка полезен для определения, где во временном
// интервале находится эта конкретная длительность,
// например, чтобы разбить её на часы, минуты и секунды:
std::cout << s << " (секунд) = "
<< std::chrono::duration_cast<std::chrono::hours>(
s) << " (часов) + "
<< std::chrono::duration_cast<std::chrono::minutes>(
s % 1h) << " (минут) + "
<< std::chrono::duration_cast<std::chrono::seconds>(
s % 1min) << " (секунд)\n";
}
Вывод:
1 час + 2*10 минут + 70/10 секунд = 4807s (секунд)
Разделив это на 2 минуты, получим 40
Разделив это на 2, получим 2403 секунды
4807s (секунд) = 1h (часов) + 20min (минут) + 7s (секунд)
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 3050 | C++11 | ограничение конвертируемости использовало неконстантное xvalue | вместо этого используются константные lvalue |