5

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 にのみ存在する場合は、私も知りたいです。

4

0 に答える 0