" ", , rvalue lvalue. " " - , .
:
template <typename F, typename X>
binder<F&&, X&&> bind(F&& f, X&& x)
binder , rvalue-, ( lvalue, rvalue bind). , &&, , - .
, binder bind ( ), :
template <typename F, typename X>
struct binder
{
binder(F g, X y) : f(std::forward<F>(g)), x(std::forward<X>(y)) {}
void operator()() { f(std::forward<X>(x)); }
F f;
X x;
};
F X , F&& X&&, lvalue ( && ), 're reval ( && !)
binder , , bind :
template <typename F, typename X>
binder<F, X> bind(F&& f, X&& x)
{
return binder<F, X>(std::forward<F>(f), std::forward<X>(x));
}
binder lvalue, ( ), binder &&, lvalue, rvalue .
, , rvalue. lvalue, , , , lvalues rvalues operator(). , F& X& ( , , F X)
, :
template <typename F, typename X>
struct binder
{
binder(F& g, X& y) : f(g), x(y) { }
void operator()() { f(std::forward<X>(x)); }
F& f;
X& x;
};
template <typename F, typename X>
binder<F, X> bind(F&& f, X&& x)
{
return binder<F, X>(f, x);
}
F X std::forward<X>(x), , .
, , () :
bind(f, i)(); // X is int&, X&& is int&
bind(f, j)(); // X is const int&, X&& is const int&
bind(f, 3)(); // X is int, X&& is int&&