18 template <
typename T =
void>
using plus = std::plus<T>;
19 template <
typename T =
void>
using multiplies = std::multiplies<T>;
20 template <
typename T =
void>
using bit_and = std::bit_and<T>;
21 template <
typename T =
void>
using bit_or = std::bit_or<T>;
22 template <
typename T =
void>
using bit_xor = std::bit_xor<T>;
23 template <
typename T =
void>
using logical_and = std::logical_and<T>;
24 template <
typename T =
void>
using logical_or = std::logical_or<T>;
26 template <
typename T =
void>
struct minimum {
28 return std::less<T>()(lhs, rhs) ? lhs : rhs;
33 struct is_transparent {};
34 template <
typename T,
typename U>
36 typename std::common_type<T &&, U &&>::type {
37 return std::less<>()(std::forward<const T>(lhs), std::forward<const U>(rhs))
38 ? std::forward<T>(lhs)
39 : std::forward<U>(rhs);
43 template <
typename T =
void>
struct maximum {
45 return std::greater<T>()(lhs, rhs) ? lhs : rhs;
50 struct is_transparent {};
51 template <
typename T,
typename U>
53 typename std::common_type<T &&, U &&>::type {
54 return std::greater<>()(std::forward<const T>(lhs),
55 std::forward<const U>(rhs))
56 ? std::forward<T>(lhs)
57 : std::forward<U>(rhs);