我需要将通用引用存储在一个类中(我确信引用的值会比这个类更长寿)。有这样做的规范方法吗?
这是我想出的一个最小示例。它似乎有效,但我不确定我是否做对了。
template <typename F, typename X>
struct binder
{
template <typename G, typename Y>
binder(G&& g, Y&& y) : f(std::forward<G>(g)), x(std::forward<Y>(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&&>(std::forward<F>(f), std::forward<X>(x));
}
void test()
{
int i = 1;
const int j = 2;
auto f = [](int){};
bind(f, i)(); // X&& is int&
bind(f, j)(); // X&& is const int&
bind(f, 3)(); // X&& is int&&
}
我的推理是正确的还是会导致细微的错误?此外,是否有更好(即更简洁)的方式来编写构造函数?binder(F&& f, X&& x)
将不起作用,因为这些是 r 值引用,因此不允许binder(f, i)
.