std::modulus<void>
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <functional>
|
||
template<> class modulus<void>; |
(начиная с C++14) | |
std::modulus<> является специализацией std::modulus с выведенным типом параметра и возвращаемого значения.
Типы элементы
| Тип элемент | Определение |
is_transparent
|
/* неопределено */ |
Функции-элементы
| возвращает модуль двух аргументов (public функция-элемент) |
std::modulus<>::operator()
<tbody> </tbody> template< class T, class U> constexpr auto operator()( T&& lhs, U&& rhs ) const -> decltype(std::forward<T>(lhs) % std::forward<U>(rhs)); |
||
Возвращает остаток от деления lhs на rhs (или что-то ещё, для чего перегружен operator%).
Параметры
| lhs, rhs | — | значения для деления |
Возвращаемое значение
Результат lhs % rhs.
Примечание
Тип элемент is_transparent указывает вызывающему объекту, что этот функциональный объект является прозрачным: он принимает аргументы произвольных типов и использует идеальную переадресацию, которая позволяет избежать ненужного копирования и преобразования, когда функциональный объект используется в разнородном контексте или с аргументами rvalue. В частности, шаблонные функции, такие как std::set::find и std::set::lower_bound , используют этот тип элемента в своих типах Compare.
Пример
Запустить этот код
#include <functional>
#include <iostream>
struct M
{
M(int x) { std::cout << "M(" << x << ");\n"; }
M() {}
};
auto operator% (M, M) { std::cout << "operator% (M, M);\n"; return M{}; }
auto operator% (M, int) { std::cout << "operator% (M, int);\n"; return M{}; }
auto operator% (int, M) { std::cout << "operator% (int, M);\n"; return M{}; }
int main()
{
M m1, m2;
m1 % m2;
m1 % 42;
42 % m1;
std::modulus<M>{}(m1, 42); // 42 преобразуется во временный M{42}
std::modulus<> {}(m1, 42); // нет временного объекта, вызывается operator% (M, int)
std::modulus<> {}(42, m1); // нет временного объекта, вызывается operator% (int, M)
}
Вывод:
operator% (M, M);
operator% (M, int);
operator% (int, M);
M(42);
operator% (M, M);
operator% (M, int);
operator% (int, M);