C++11 では、メンバー関数を参照修飾する機能と、完全な転送が導入されました。しかし、それらを混ぜ合わせることはできますか?
この(実際の)例を考えてみましょう:
struct bar{
std::string str;
void do_stuff() & {
/* version 1 */
}
void do_stuff() && {
/* version 2 */
}
};
struct foo{
bar data;
void do_stuff() & {
data.do_stuff();
}
void do_stuff() && {
std::move(data).do_stuff();
}
};
int main(){
foo f;
f.do_stuff() // calls version 1 of bar::do_stuff()
std::move(f).do_stuff() // calls version 2 of bar::do_stuff()
}
内部main()
では、最初の呼び出しでバージョン 1 または が呼び出さbar::do_stuff()
れ、2 番目の呼び出しでバージョン 2 または が呼び出されますbar::do_stuff()
。にコードの重複がありますfoo::do_stuff()
。ref-qualifiers が暗黙の 以外の引数用である場合、*this
完全な転送を簡単に行うことができます。
template <typename T>
void do_stuff (T&& t) {
std::forward<T>(t).do_stuff();
}
*this
オブジェクトを完全に転送する同等の方法はありますか?
注: 適切な解決策が C++14 または C++17 にのみ存在する場合は、私も知りたいです。