1#ifndef MSTL_CORE_FUNCTIONAL_FUNCTOR_HPP__
2#define MSTL_CORE_FUNCTIONAL_FUNCTOR_HPP__
30template <
typename Arg,
typename Result>
46template <
typename Arg1,
typename Arg2,
typename Result>
70template <
typename T =
void>
72 MSTL_NODISCARD
constexpr T operator ()(
const T& x,
const T& y)
const
83 using is_transparent = void;
85 template <
typename T1,
typename T2>
86 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
87 noexcept(
noexcept(
static_cast<T1&&
>(x) +
static_cast<T2&&
>(y)))
88 ->
decltype(
static_cast<T1&&
>(x) +
static_cast<T2&&
>(y)) {
89 return static_cast<T1&&
>(x) +
static_cast<T2&&
>(y);
101template <
typename T =
void>
103 MSTL_NODISCARD
constexpr T operator ()(
const T& x,
const T& y)
const
114 using is_transparent = void;
116 template <
typename T1,
typename T2>
117 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
118 noexcept(
noexcept(
static_cast<T1&&
>(x) -
static_cast<T2&&
>(y)))
119 ->
decltype(
static_cast<T1&&
>(x) -
static_cast<T2&&
>(y)) {
120 return static_cast<T1&&
>(x) -
static_cast<T2&&
>(y);
131template <
typename T =
void>
133 MSTL_NODISCARD
constexpr T operator ()(
const T& x,
const T& y)
const
144 using is_transparent = void;
146 template <
typename T1,
typename T2>
147 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
148 noexcept(
noexcept(
static_cast<T1&&
>(x) *
static_cast<T2&&
>(y)))
149 ->
decltype(
static_cast<T1&&
>(x) *
static_cast<T2&&
>(y)) {
150 return static_cast<T1&&
>(x) *
static_cast<T2&&
>(y);
161template <
typename T =
void>
163 MSTL_NODISCARD
constexpr T operator ()(
const T& x,
const T& y)
const
174 using is_transparent = void;
176 template <
typename T1,
typename T2>
177 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
178 noexcept(
noexcept(
static_cast<T1&&
>(x) /
static_cast<T2&&
>(y)))
179 ->
decltype(
static_cast<T1&&
>(x) /
static_cast<T2&&
>(y)) {
180 return static_cast<T1&&
>(x) /
static_cast<T2&&
>(y);
191template <
typename T =
void>
193 MSTL_NODISCARD
constexpr T operator ()(
const T& x,
const T& y)
const
204 using is_transparent = void;
206 template <
typename T1,
typename T2>
207 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
208 noexcept(
noexcept(
static_cast<T1&&
>(x) %
static_cast<T2&&
>(y)))
209 ->
decltype(
static_cast<T1&&
>(x) %
static_cast<T2&&
>(y)) {
210 return static_cast<T1&&
>(x) %
static_cast<T2&&
>(y);
221template <
typename T =
void>
223 MSTL_NODISCARD
constexpr T operator ()(
const T& x)
const
234 using is_transparent = void;
236 template <
typename T1>
237 MSTL_NODISCARD
constexpr auto operator ()(T1&& x)
const
238 noexcept(
noexcept(-
static_cast<T1&&
>(x)))
239 ->
decltype(-
static_cast<T1&&
>(x)) {
240 return -
static_cast<T1&&
>(x);
259template <
typename T =
void>
261 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
272 using is_transparent = void;
274 template <
typename T1,
typename T2>
275 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
276 noexcept(
noexcept(
static_cast<T1&&
>(x) ==
static_cast<T2&&
>(y)))
277 ->
decltype(
static_cast<T1&&
>(x) ==
static_cast<T2&&
>(y)) {
278 return static_cast<T1&&
>(x) ==
static_cast<T2&&
>(y);
289template <
typename T =
void>
291 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
302 using is_transparent = void;
304 template <
typename T1,
typename T2>
305 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
306 noexcept(
noexcept(
static_cast<T1&&
>(x) !=
static_cast<T2&&
>(y)))
307 ->
decltype(
static_cast<T1&&
>(x) !=
static_cast<T2&&
>(y)) {
308 return static_cast<T1&&
>(x) !=
static_cast<T2&&
>(y);
319template <
typename T =
void>
321 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
332 using is_transparent = void;
334 template <
typename T1,
typename T2>
335 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
336 noexcept(
noexcept(
static_cast<T1&&
>(x) >
static_cast<T2&&
>(y)))
337 ->
decltype(
static_cast<T1&&
>(x) >
static_cast<T2&&
>(y)) {
338 return static_cast<T1&&
>(x) >
static_cast<T2&&
>(y);
349template <
typename T =
void>
351 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
362 using is_transparent = void;
364 template <
typename T1,
typename T2>
365 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
366 noexcept(
noexcept(
static_cast<T1&&
>(x) <
static_cast<T2&&
>(y)))
367 ->
decltype(
static_cast<T1&&
>(x) <
static_cast<T2&&
>(y)) {
368 return static_cast<T1&&
>(x) <
static_cast<T2&&
>(y);
379template <
typename T =
void>
381 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
392 using is_transparent = void;
394 template <
typename T1,
typename T2>
395 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
396 noexcept(
noexcept(
static_cast<T1&&
>(x) >=
static_cast<T2&&
>(y)))
397 ->
decltype(
static_cast<T1&&
>(x) >=
static_cast<T2&&
>(y)) {
398 return static_cast<T1&&
>(x) >=
static_cast<T2&&
>(y);
409template <
typename T =
void>
411 MSTL_NODISCARD
constexpr bool operator ()(
const T& x,
const T& y)
const
422 using is_transparent = void;
424 template <
typename T1,
typename T2>
425 MSTL_NODISCARD
constexpr auto operator ()(T1&& x, T2&& y)
const
426 noexcept(
noexcept(
static_cast<T1&&
>(x) <=
static_cast<T2&&
>(y)))
427 ->
decltype(
static_cast<T1&&
>(x) <=
static_cast<T2&&
>(y)) {
428 return static_cast<T1&&
>(x) <=
static_cast<T2&&
>(y);
449 template <
typename U = T>
450 MSTL_NODISCARD
constexpr U&& operator ()(U&& x)
const noexcept {
463template <
typename Pair>
465#ifdef MSTL_STANDARD_20__
466 static_assert(is_pair_v<Pair>,
"select1st requires pair type.");
469 MSTL_NODISCARD
constexpr const typename Pair::first_type&
470 operator ()(
const Pair& x)
const noexcept {
482template <
typename Pair>
484#ifdef MSTL_STANDARD_20__
485 static_assert(is_pair_v<Pair>,
"select2nd requires pair type.");
488 MSTL_NODISCARD
constexpr const typename Pair::second_type&
489 operator ()(
const Pair& x)
const noexcept {
MSTL_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
Arg1 first_argument_type
第一个参数类型
Arg2 second_argument_type
第二个参数类型