14#ifndef RANGES_V3_DETAIL_BIND_BACK_HPP
15#define RANGES_V3_DETAIL_BIND_BACK_HPP
26#include <range/v3/detail/prologue.hpp>
35 template<
typename Fn,
typename... Args>
38 using tuple_t = std::tuple<Fn, Args...>;
41 template<
typename... CallArgs>
42 constexpr invoke_result_t<Fn, CallArgs..., Args...>
43 operator()(CallArgs &&... cargs) &&
44 noexcept(is_nothrow_invocable_v<Fn, CallArgs..., Args...>)
47 [&](
auto && fn,
auto &&... args) ->
decltype(
auto) {
48 return invoke((
decltype(fn))fn,
49 (CallArgs &&) cargs...,
50 (
decltype(args))args...);
52 (std::tuple<Fn, Args...> &&) fn_args_);
56 template<
typename... CallArgs>
57 constexpr invoke_result_t<Fn &, CallArgs..., Args &...>
59 noexcept(is_nothrow_invocable_v<Fn &, CallArgs..., Args &...>)
62 [&](
auto & fn,
auto &... args) ->
decltype(
auto) {
63 return invoke(fn, (CallArgs &&) cargs..., args...);
69 template<
typename... CallArgs>
70 constexpr invoke_result_t<Fn
const &, CallArgs..., Args
const &...>
72 noexcept(is_nothrow_invocable_v<Fn
const &, CallArgs..., Args
const &...>)
75 [&](
auto & fn,
auto &... args) ->
decltype(
auto) {
76 return invoke(fn, (CallArgs &&) cargs..., args...);
84 template<
typename Fn,
typename Arg>
85 struct bind_back_fn_<Fn, Arg>
94 template<
typename... CallArgs>
95 constexpr invoke_result_t<Fn, CallArgs..., Arg>
96 operator()(CallArgs &&... cargs) &&
97 noexcept(is_nothrow_invocable_v<Fn, CallArgs..., Arg>)
100 (Fn &&) fn_args_.fn_, (CallArgs &&) cargs..., (Arg &&) fn_args_.arg_);
103 template<
typename... CallArgs>
104 constexpr invoke_result_t<Fn &, CallArgs..., Arg &>
105 operator()(CallArgs &&... cargs) &
106 noexcept(is_nothrow_invocable_v<Fn &, CallArgs..., Arg &>)
108 return invoke(fn_args_.fn_, (CallArgs &&) cargs..., fn_args_.arg_);
111 template<
typename... CallArgs>
112 constexpr invoke_result_t<Fn
const &, CallArgs..., Arg
const &>
113 operator()(CallArgs &&... cargs)
const &
114 noexcept(is_nothrow_invocable_v<Fn
const &, CallArgs..., Arg
const &>)
116 return invoke(fn_args_.fn_, (CallArgs &&) cargs..., fn_args_.arg_);
120 template<
typename Fn,
typename Arg0,
typename Arg1>
121 struct bind_back_fn_<Fn, Arg0, Arg1>
131 template<
typename... CallArgs>
132 constexpr invoke_result_t<Fn, CallArgs..., Arg0, Arg1>
133 operator()(CallArgs &&... cargs) &&
134 noexcept(is_nothrow_invocable_v<Fn, CallArgs..., Arg0, Arg1>)
136 return invoke((Fn &&) fn_args_.fn_,
137 (CallArgs &&) cargs...,
138 (Arg0 &&) fn_args_.arg0_,
139 (Arg1 &&) fn_args_.arg1_);
142 template<
typename... CallArgs>
143 constexpr invoke_result_t<Fn &, CallArgs..., Arg0 &, Arg1 &>
144 operator()(CallArgs &&... cargs) &
145 noexcept(is_nothrow_invocable_v<Fn &, CallArgs..., Arg0 &, Arg1 &>)
148 fn_args_.fn_, (CallArgs &&) cargs..., fn_args_.arg0_, fn_args_.arg1_);
151 template<
typename... CallArgs>
152 constexpr invoke_result_t<Fn
const &, CallArgs..., Arg0
const &, Arg1
const &>
153 operator()(CallArgs &&... cargs)
const &
154 noexcept(is_nothrow_invocable_v<Fn
const &,
160 fn_args_.fn_, (CallArgs &&) cargs..., fn_args_.arg0_, fn_args_.arg1_);
165 template<
typename Fn,
typename... Args>
166 using bind_back_fn = bind_back_fn_<decay_t<Fn>, decay_t<Args>...>;
171 template<
typename Fn,
typename Arg1,
typename... Args>
173 operator()(Fn && fn, Arg1 && arg1, Args &&... args)
const
175#if defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 5
177 return {T{(Fn &&) fn, (Arg1 &&) arg1, (Args &&) args...}};
179 return {{(Fn &&) fn, (Arg1 &&) arg1, (Args &&) args...}};
190#include <range/v3/detail/epilogue.hpp>
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition meta.hpp:541
Definition bind_back.hpp:170
Definition bind_back.hpp:37
constexpr invoke_result_t< Fn const &, CallArgs..., Args const &... > operator()(CallArgs &&... cargs) const &noexcept(is_nothrow_invocable_v< Fn const &, CallArgs..., Args const &... >)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition bind_back.hpp:71
constexpr invoke_result_t< Fn &, CallArgs..., Args &... > operator()(CallArgs &&... cargs) &noexcept(is_nothrow_invocable_v< Fn &, CallArgs..., Args &... >)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition bind_back.hpp:58