どうすれば次のことができるのだろうか
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
、この場合は、の代わりに使用できます。