成员函数的完美转发和ref-qualifiers

时间:2017-05-24 07:18:24

标签: c++ c++11 perfect-forwarding ref-qualifier

C ++ 11引入了对成员函数进行ref-qualify以及完美转发的能力。但我们可以将它们混合在一起吗?

考虑这个(工作)的例子:

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或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中,我也很乐意知道。

0 个答案:

没有答案