fix(templates): fix the initialization problem of TVariant members with cv-qualifiers

This commit is contained in:
_Redstone_c_ 2022-03-30 12:06:05 +08:00
parent 91755d2196
commit 782f5f5cb2

View File

@ -37,6 +37,9 @@ struct TVariantAlternativeType<I, T, Types...>
template <typename T, typename... Types> template <typename T, typename... Types>
struct TVariantAlternativeType<0, T, Types...> { using Type = T; }; struct TVariantAlternativeType<0, T, Types...> { using Type = T; };
template <>
struct TVariantAlternativeType<0> { };
template <typename T, typename... Types> template <typename T, typename... Types>
struct TVariantSelectedType; struct TVariantSelectedType;
@ -46,17 +49,18 @@ struct TVariantSelectedType<T, U, Types...>
using TypeAlternativeA = typename TConditional<TIsConstructible<U, T&&>::Value, U, void>::Type; using TypeAlternativeA = typename TConditional<TIsConstructible<U, T&&>::Value, U, void>::Type;
using TypeAlternativeB = typename TVariantSelectedType<T, Types...>::Type; using TypeAlternativeB = typename TVariantSelectedType<T, Types...>::Type;
using Type = typename TConditional<TIsSame<TypeAlternativeA, void>::Value, TypeAlternativeB, using Type = typename TConditional<TIsSame<typename TRemoveCVRef<TypeAlternativeA>::Type, void>::Value, TypeAlternativeB,
typename TConditional<TIsSame<TypeAlternativeB, void>::Value, TypeAlternativeA, typename TConditional<TIsSame<typename TRemoveCVRef<TypeAlternativeB>::Type, void>::Value, TypeAlternativeA,
typename TConditional<TIsSame<TypeAlternativeB, T>::Value, TypeAlternativeB, TypeAlternativeA>::Type>::Type>::Type; typename TConditional<TIsSame<typename TRemoveCVRef<TypeAlternativeB>::Type, typename TRemoveCVRef<T>::Type>::Value, TypeAlternativeB, TypeAlternativeA>::Type>::Type>::Type;
// 0 - Type not found // 0 - Type not found
// 1 - Same type found // 1 - Same type found
// 2 - Multiple types found // 2 - Multiple types found
// 3 - The type found // 3 - The type found
static constexpr uint8 Flag = TIsSame<Type, void>::Value ? 0 : static constexpr uint8 Flag = TIsSame<typename TRemoveCVRef<Type>::Type, void>::Value ? 0 :
TIsSame<Type, T>::Value ? 1 : TIsSame<typename TRemoveCVRef<TypeAlternativeA>::Type, typename TRemoveCVRef<TypeAlternativeB>::Type>::Value ? 2 :
!TIsSame<TypeAlternativeA, void>::Value && !TIsSame<TypeAlternativeB, void>::Value ? 2 : 3; TIsSame<typename TRemoveCVRef< Type>::Type, typename TRemoveCVRef< T>::Type>::Value ? 1 :
!TIsSame<typename TRemoveCVRef<TypeAlternativeA>::Type, void>::Value && !TIsSame<TypeAlternativeB, void>::Value ? 2 : 3;
static constexpr bool Value = Flag & 1; static constexpr bool Value = Flag & 1;
@ -524,6 +528,9 @@ constexpr void Swap(TVariant<Types...>& A, TVariant<Types...>& B)
template <typename T > struct TIsVariantSpecialization : FFalse { }; template <typename T > struct TIsVariantSpecialization : FFalse { };
template <typename... Types> struct TIsVariantSpecialization<TVariant<Types...>> : FTrue { }; template <typename... Types> struct TIsVariantSpecialization<TVariant<Types...>> : FTrue { };
template <typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value
struct TVariantAlternativeSize : TConstant<size_t, VariantType::AlternativeSize> { };
template <size_t I, typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value template <size_t I, typename VariantType> requires TIsVariantSpecialization<typename TRemoveCVRef<VariantType>::Type>::Value
struct TVariantAlternativeType { using Type = typename TCopyCV<typename TRemoveReference<VariantType>::Type, typename TRemoveCVRef<VariantType>::Type::template TAlternativeType<I>::Type>::Type; }; struct TVariantAlternativeType { using Type = typename TCopyCV<typename TRemoveReference<VariantType>::Type, typename TRemoveCVRef<VariantType>::Type::template TAlternativeType<I>::Type>::Type; };