我想知道如何完成以下操作。
我该如何传递一个右值引用,并将其作为右值引用(可能被包装)存储在调用包装器中?我知道我可以手动编写一个类,例如
我按照AProgrammer的建议实现了它:
现在我能说
void f(string &&s) {
std::string i(move(s));
/* other stuff */
}
int main() {
std::string s;
bind(f, s)(); // Error.
bind(f, move(s))(); // Error.
bind(f, ref(s))(); // Error.
}
我该如何传递一个右值引用,并将其作为右值引用(可能被包装)存储在调用包装器中?我知道我可以手动编写一个类,例如
std::reference_wrapper<>
,该类具有转换函数到T&&
,但我更愿意避免这样做并使用标准技术。
我按照AProgrammer的建议实现了它:
template<typename T> struct adv {
T t;
explicit adv(T &&t):t(forward<T>(t)) {}
template<typename ...U> T &&operator()(U &&...) {
return forward<T>(t);
}
};
template<typename T> adv<T> make_adv(T &&t) {
return adv<T>{forward<T>(t)};
}
namespace std {
template<typename T>
struct is_bind_expression< adv<T> > : std::true_type {};
}
现在我能说
void f(string &&s) {
std::string i(move(s));
/* other stuff */
}
int main() {
std::string s;
bind(f, make_adv(move(s)))(); // Works!
}
如果我们将一个左值传递给make_adv
函数,它会将其转发为引用输入参数的左值,因此它可以作为std::ref
的替代品在这种情况下使用。