Информация об изменениях

Сообщение Re[6]: Про перемещение (на примере кода) от 16.03.2025 11:09

Изменено 16.03.2025 11:10 rg45

Re[6]: Про перемещение (на примере кода)
Здравствуйте, Doom100500, Вы писали:

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


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

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

А в C++23 появляется ещё один наворот - [url=https://en.cppreference.com/w/cpp/language/function#Parameter_list]explicit object parameter[/url]. С помощью него обе эти перегрузки можно будет покрыть одной функцией:

[cpp]
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<T>>)
    decltype(auto) get(this Self&& self) {
        return (std::forward<Self>(self)._trackedClass); 
    }
};
Re[6]: Про перемещение (на примере кода)
Здравствуйте, 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<T>>)
    decltype(auto) get(this Self&& self) {
        return (std::forward<Self>(self)._trackedClass); 
    }
};