partial_apply, const-:
template<class F, class...Args>
struct partial_apply_t {
std::tuple<Args...> args;
F f;
template<size_t...Is, class Self, class...Extra>
static auto apply( Self&& self, std::index_sequence<Is...>, Extra&&...extra )
-> decltype(
(std::forward<Self>(self).f)(
std::get<Is>(std::forward<Self>(self).args)...,
std::declval<Extra>()...
)
{
return std::forward<Self>(self).f(
std::get<Is>(std::forward<Self>(self).args)...,
std::forward<Extra>(extra)...
);
}
partial_apply_t(partial_apply_t const&)=default;
partial_apply_t(partial_apply_t&&)=default;
partial_apply_t& operator=(partial_apply_t const&)=default;
partial_apply_t& operator=(partial_apply_t&&)=default;
~partial_apply_t()=default;
template<class F0, class...Us,
class=std::enable_if_t<
std::is_convertible<std::tuple<F0, Us...>, std::tuple<F, Args...>>{}
>
>
partial_apply_t(F0&& f0, Us&&...us):
f(std::forward<F0>(f0)),
args(std::forward<Us>(us)...)
{}
template<class...Extra, class Indexes=std::index_sequence_for<Extra>>
auto operator()(Extra&&...extra)const&
-> decltype( apply( std::declval<partial_apply_t const&>(), Indexes{}, std::declval<Extra>()... ) )
{
return apply( *this, Indexes{}, std::forward<Extra>(extra)... );
}
template<class...Extra, class Indexes=std::index_sequence_for<Extra>>
auto operator()(Extra&&...extra)&
-> decltype( apply( std::declval<partial_apply_t&>(), Indexes{}, std::declval<Extra>()... ) )
{
return apply( *this, Indexes{}, std::forward<Extra>(extra)... );
}
template<class...Extra, class Indexes=std::index_sequence_for<Extra>>
auto operator()(Extra&&...extra)&&
-> decltype( apply( std::declval<partial_apply_t&&>(), Indexes{}, std::declval<Extra>()... ) )
{
return apply( std::move(*this), Indexes{}, std::forward<Extra>(extra)... );
}
};
template<class F, class... Ts>
partial_apply_t<std::decay_t<F>, std::decay_t<Ts>...>
partial_apply(F&& f, Ts&&...ts) {
return {std::forward<F>(f), std::forward<Ts>(ts)...};
}
:
auto fun = partial_apply(
[](auto&& foo) -> decltype(auto) { return foo(); },
foo
);
foo partial_apply, , , ( const-) . , foo fun.
, , , , , , std::ref , , args, std::reference_wrapper .
: a reference_unwrapper, std::reference_wrapper s.
partial_apply decay_t ing.