Re[6]: Про перемещение (на примере кода)
От: rg45 СССР  
Дата: 16.03.25 11:09
Оценка: +1
Здравствуйте, Doom100500, Вы писали:

D>Здравствуйте, rg45, Вы писали:


R>>
R>>class Wrapper {
R>>// . . .    
R>>    const TrackedClass& get() const & { return _trackedClass; }
R>>    TrackedClass&& get() && { return std::move(_trackedClass); }
R>>};
R>>


D>Опа! А это что за синтаксис? Когда появился? Как называется?


А в C++23 появляется ещё один наворот — explicit object parameter. С помощью него обе эти перегрузки можно будет покрыть одной функцией:

class Wrapper {
// . . .    
    template <typename Self>
    decltype(auto) get(this Self&& self) {
        return (std::forward<Self>(self)._trackedClass); 
    }
};


Если нужно предоставить не все варианты перегрузок, можно добавить констрейнтов по вкусу:

class Wrapper {
// . . .    
    template <typename Self>
    requires (
        std::is_rvalue_refrence_v<Self>
        or std::is_const_v<std::remove_refrerence_t<Self>>)
    decltype(auto) get(this Self&& self) {
        return (std::forward<Self>(self)._trackedClass); 
    }
};


Нравится?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 16.03.2025 11:14 rg45 . Предыдущая версия . Еще …
Отредактировано 16.03.2025 11:13 rg45 . Предыдущая версия .
Отредактировано 16.03.2025 11:12 rg45 . Предыдущая версия .
Отредактировано 16.03.2025 11:11 rg45 . Предыдущая версия .
Отредактировано 16.03.2025 11:10 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.