: .
auto make_f();
auto&& q = apply_function_queue(make_f());
q(a, b, c);
. :
template<class... T> void f(T&&... p) {}
. , : T... T&&....
lvalue R rvalue Q:
R a;
f(a, Q{});
T... R&, Q, T&&... R&, Q&&.
p T&&....
'decltype'(std::forward<T>(p)...) === T&&...
(. decltype - .)
, (T...) /, / rvalue (T&&...) /.
&& , apply_function_queue . ( temporary_function_queue<F&&...> apply_function_queue, && temporary_function_queue. && , temporary_function_queue<F&&...>.)
, && , , &&.
. ( F..., F&&....) , && apply_function_queue.
:
apply_function_queue
:
template <class... F>
constexpr temporary_function_queue<F...> apply_function_queue(F&&... f);
:
template <class... F>
constexpr temporary_function_queue<F...> apply_function_queue(F&&... f)
{
return temporary_function_queue<F...>(std::forward<F>(f)...);
}
temporary_type
temporary_function_queue<F...> not temporary_function_queue<F&&...>!
using temporary_type = temporary_function_queue<F...>;
friend constexpr temporary_type apply_function_queue<F...>(F&&... f);
rvalue , /, .
decltype(auto) operator()(Args&&... args) const&& ,
decltype(std::get<0>(_f)) === std::tuple_element_t<0u, data_type>&
lvalue. , , , tuple_element::type.
, :
return static_cast<std::tuple_element_t<0u, data_type>>(
std::get<0>(_f))(std::forward<Args>(args)...);
( ):
return std::forward<std::tuple_element_t<0u, data_type>>(
std::get<0>(_f))(std::forward<Args>(args)...);