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

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

Изменено 16.03.2025 11:12 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>>};
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); 
    }
};
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); 
    }
};