BAN: Add Forward()

This commit is contained in:
Bananymous 2023-01-17 11:15:57 +02:00
parent b9a4530e54
commit 124afbecaa
1 changed files with 28 additions and 9 deletions

View File

@ -3,17 +3,36 @@
namespace BAN
{
template <class T>
struct RemoveReference { typedef T type; };
template<typename T>
struct RemoveReference { using type = T; };
template<typename T>
struct RemoveReference<T&> { using type = T; };
template<typename T>
struct RemoveReference<T&&> { using type = T; };
template <class T>
struct RemoveReference<T&> { typedef T type; };
template<typename T>
struct IsLValueReference { static constexpr bool value = false; };
template<typename T>
struct IsLValueReference<T&> { static constexpr bool value = true; };
template <class T>
struct RemoveReference<T&&> { typedef T type; };
template<class T>
typename RemoveReference<T>::type&&
Move( T&& Arg ) { return (typename RemoveReference<T>::type&&)Arg; }
template<typename T>
constexpr typename RemoveReference<T>::type&& Move(T&& arg)
{
return static_cast<typename RemoveReference<T>::type&&>(arg);
}
template<typename T>
constexpr T&& Forward(typename RemoveReference<T>::type& arg)
{
return static_cast<T&&>(arg);
}
template<typename T>
constexpr T&& Forward(typename RemoveReference<T>::type&& arg)
{
static_assert(!IsLValueReference<T>::value);
return static_cast<T&&>(arg);
}
}