Оператор +, -, *, /, %(std::chrono::duration)
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
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) | (с C++11) |
Выполняет основные арифметические операции между двумя продолжительностями или между продолжительностью и отметкой времени.
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()
{
// Simple arithmetic:
std::chrono::seconds s = std::chrono::hours(1)
+ 2 * std::chrono::minutes(10)
+ std::chrono::seconds(70) / 10;
std::cout << "1 hour + 2*10 min + 70/10 sec = " << s << " (seconds)\n";
using namespace std::chrono_literals;
// Difference between dividing a duration by a number
// and dividing a duration by another duration:
std::cout << "Dividing that by 2 minutes gives "
<< s / 2min << '\n'
<< "Dividing that by 2 gives "
<< (s / 2).count() << " seconds\n";
// The remainder operator is useful in determining where
// in a time frame is this particular duration, e.g. to
// break it down into hours, minutes, and seconds:
std::cout << s << " (seconds) = "
<< std::chrono::duration_cast<std::chrono::hours>(
s) << " (hour) + "
<< std::chrono::duration_cast<std::chrono::minutes>(
s % 1h) << " (minutes) + "
<< std::chrono::duration_cast<std::chrono::seconds>(
s % 1min) << " (seconds)\n";
constexpr auto sun_earth_distance{150'000'000ULL}; // km
constexpr auto speed_of_light{300000ULL}; // km/sec
std::chrono::seconds t(sun_earth_distance / speed_of_light); // sec
std::cout << "A photon flies from the Sun to the Earth in "
<< t / 1min << " minutes " << t % 1min << " (seconds)\n";
}Вывод:
1 hour + 2*10 min + 70/10 sec = 4807s (seconds) Dividing that by 2 minutes gives 40 Dividing that by 2 gives 2403 seconds 4807s (seconds) = 1h (hour) + 20min (minutes) + 7s (seconds) A photon flies from the Sun to the Earth in 8 minutes 20s (seconds)
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 3050 | C++11 | ограничение преобразуемости использовало неконстантное xзначение | использование константных lзначений вместо этого |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/chrono/duration/operator_arith4