Идеальная переадресация и реф-квалификаторы для функций-членов

В 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 или bar::do_stuff(), Существует некоторое дублирование кода в foo::do_stuff(), Если ref-квалификаторы были для аргумента, отличного от подразумеваемого *thisмы могли бы легко сделать идеальную пересылку:

template <typename T>
void do_stuff (T&& t) {
    std::forward<T>(t).do_stuff();
}

Есть ли эквивалентный способ идеально переслать *this объект?

Примечание: если правильное решение существует только в C++14 или C++17, я был бы рад узнать и это.

0 ответов

Другие вопросы по тегам