В 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, я был бы рад узнать и это.
Задача ещё не решена.
Других решений пока нет …