Здравствуйте, 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);
}
};
Нравится?