feat(typetraits): add CDerivedFrom and the corresponding testing

This commit is contained in:
_Redstone_c_ 2023-01-08 18:03:05 +08:00
parent c7e3ac32b4
commit d825285a4a
2 changed files with 5 additions and 0 deletions

View File

@ -322,6 +322,10 @@ void TestTypeTraits()
always_check(!(CConvertibleTo<FTestStructE*, FTestStructH*>)); always_check(!(CConvertibleTo<FTestStructE*, FTestStructH*>));
always_check((CConvertibleTo<FTestStructW, FTestStructV>)); always_check((CConvertibleTo<FTestStructW, FTestStructV>));
always_check(!(CDerivedFrom<FTestStructD, FTestStructH>));
always_check(!(CDerivedFrom<FTestStructE, FTestStructH>));
always_check((CDerivedFrom<FTestStructH, FTestStructE>));
always_check((CSameAs<int32, TRemoveConst<int32>>)); always_check((CSameAs<int32, TRemoveConst<int32>>));
always_check(!(CSameAs<int32, TRemoveConst<int32*>>)); always_check(!(CSameAs<int32, TRemoveConst<int32*>>));
always_check(!(CSameAs<int32, TRemoveConst<int32&>>)); always_check(!(CSameAs<int32, TRemoveConst<int32&>>));

View File

@ -31,6 +31,7 @@ template <typename T, size_t I = 0> inline constexpr size_t TExtent = NAMESPACE
template <typename T, typename U> concept CSameAs = NAMESPACE_STD::is_same_v<T, U>; template <typename T, typename U> concept CSameAs = NAMESPACE_STD::is_same_v<T, U>;
template <typename T, typename U> concept CBaseOf = NAMESPACE_STD::is_base_of_v<T, U>; template <typename T, typename U> concept CBaseOf = NAMESPACE_STD::is_base_of_v<T, U>;
template <typename T, typename U> concept CConvertibleTo = NAMESPACE_STD::is_convertible_v<T, U>; template <typename T, typename U> concept CConvertibleTo = NAMESPACE_STD::is_convertible_v<T, U>;
template <typename T, typename U> concept CDerivedFrom = CBaseOf<U, T> && CConvertibleTo<const volatile T*, const volatile U*>;
template <typename T> using TRemoveConst = NAMESPACE_STD::remove_const_t<T>; template <typename T> using TRemoveConst = NAMESPACE_STD::remove_const_t<T>;
template <typename T> using TRemoveVolatile = NAMESPACE_STD::remove_volatile_t<T>; template <typename T> using TRemoveVolatile = NAMESPACE_STD::remove_volatile_t<T>;