userver: userver/utils/forward_like.hpp Source File
Loading...
Searching...
No Matches
forward_like.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/utils/forward_like.hpp
4/// @brief @copybrief utils::ForwardLike
5
6#include <type_traits>
7
8#include <userver/compiler/impl/nodebug.hpp>
9
10USERVER_NAMESPACE_BEGIN
11
12namespace utils {
13
14/// Analogue of std::forward_like from C++23.
15template <typename T, typename U>
16USERVER_IMPL_NODEBUG_INLINE_FUNC inline constexpr auto&& ForwardLike(U&& x) noexcept {
17 constexpr bool is_adding_const = std::is_const_v<std::remove_reference_t<T>>;
18
19 using URef = std::remove_reference_t<U>;
20 using V = std::conditional_t<is_adding_const, std::add_const_t<URef>, URef>;
21
22 if constexpr (std::is_lvalue_reference_v<T&&>) {
23 return static_cast<V&>(x);
24 } else {
25 return static_cast<V&&>(x);
26 }
27}
28
29} // namespace utils
30USERVER_NAMESPACE_END