UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
SubclassOf.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "UObject/Class.h"
6
7#include <type_traits>
8
10
11template <typename T>
12class TSubclassOf;
13
14template <typename T>
16{
17 enum { Value = false };
18};
19
20template <typename T> struct TIsTSubclassOf< TSubclassOf<T>> { enum { Value = true }; };
21template <typename T> struct TIsTSubclassOf<const TSubclassOf<T>> { enum { Value = true }; };
22template <typename T> struct TIsTSubclassOf< volatile TSubclassOf<T>> { enum { Value = true }; };
23template <typename T> struct TIsTSubclassOf<const volatile TSubclassOf<T>> { enum { Value = true }; };
24
28template <typename T>
30{
31private:
32 template <typename U>
33 friend class TSubclassOf;
34
35public:
36 using ElementType = T;
37
38 [[nodiscard]] TSubclassOf() = default;
40 [[nodiscard]] TSubclassOf(const TSubclassOf&) = default;
42 TSubclassOf& operator=(const TSubclassOf&) = default;
43 ~TSubclassOf() = default;
44
47 : Class(From)
48 {
49 }
50
52 template <
53 typename U
55 !TIsTSubclassOf<std::decay_t<U>>::Value &&
56 std::is_convertible_v<U, UClass*>
57 )
58 >
60 : Class(From)
61 {
62 }
63
65 template <
66 typename OtherT
67 UE_REQUIRES(std::is_convertible_v<OtherT*, T*>)
68 >
70 : Class(Other.Class)
71 {
73 }
74
76 template <
77 typename OtherT
78 UE_REQUIRES(std::is_convertible_v<OtherT*, T*>)
79 >
81 {
83 Class = Other.Class;
84 return *this;
85 }
86
89 {
90 Class = From;
91 return *this;
92 }
93
95 template <
96 typename U
98 !TIsTSubclassOf<std::decay_t<U>>::Value &&
99 std::is_convertible_v<U, UClass*>
100 )
101 >
102 inline TSubclassOf& operator=(U&& From)
103 {
104 Class = From;
105 return *this;
106 }
107
109 [[nodiscard]] inline UClass* operator*() const
110 {
111 if (!Class || !Class->IsChildOf(T::StaticClass()))
112 {
113 return nullptr;
114 }
115 return Class;
116 }
117
120 {
121 return **this;
122 }
123
126 {
127 return **this;
128 }
129
132 {
133 return **this;
134 }
135
141 [[nodiscard]] inline T* GetDefaultObject() const
142 {
143 UObject* Result = nullptr;
144 if (Class)
145 {
146 Result = Class->GetDefaultObject();
147 check(Result && Result->IsA(T::StaticClass()));
148 }
149 return (T*)Result;
150 }
151
153 {
154 Ar << Class;
155 }
156
158 {
159 Slot << Class;
160 }
161
163 {
164 return GetTypeHash(SubclassOf.Class);
165 }
166
168 {
169 return Class;
170 }
171
172#if DO_CHECK
173 // This is a DEVELOPMENT ONLY debugging function and should not be relied upon. Client
174 // systems should never require unsafe access to the referenced UClass
176 {
177 return Class;
178 }
179#endif
180
181private:
182 TObjectPtr<UClass> Class = nullptr;
183};
184
185template <typename T>
186struct TCallTraits<TSubclassOf<T>> : public TCallTraitsBase<TSubclassOf<T>>
187{
189};
190
191template <typename T>
193{
195 return Ar;
196}
197
198template <typename T>
#define check(expr)
Definition AssertionMacros.h:314
#define UE_FORCEINLINE_HINT
Definition Platform.h:723
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define IWYU_MARKUP_IMPLICIT_CAST(From, To)
Definition PlatformMisc.h:251
#define UE_REQUIRES(...)
Definition Requires.h:86
FArchive & operator<<(FArchive &Ar, TSubclassOf< T > &SubclassOf)
Definition SubclassOf.h:192
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
Definition StructuredArchiveSlots.h:52
Definition SubclassOf.h:30
TSubclassOf & operator=(const TSubclassOf &)=default
~TSubclassOf()=default
UE_FORCEINLINE_HINT void Serialize(FArchive &Ar)
Definition SubclassOf.h:152
TObjectPtr< UClass > & GetGCPtr()
Definition SubclassOf.h:167
TSubclassOf & operator=(U &&From)
Definition SubclassOf.h:102
T * GetDefaultObject() const
Definition SubclassOf.h:141
TSubclassOf & operator=(TSubclassOf &&)=default
UClass * operator*() const
Definition SubclassOf.h:109
friend uint32 GetTypeHash(const TSubclassOf &SubclassOf)
Definition SubclassOf.h:162
TSubclassOf(TSubclassOf &&)=default
UE_FORCEINLINE_HINT TSubclassOf(U &&From)
Definition SubclassOf.h:59
UE_FORCEINLINE_HINT void Serialize(FStructuredArchiveSlot &Slot)
Definition SubclassOf.h:157
UE_FORCEINLINE_HINT TSubclassOf(UClass *From)
Definition SubclassOf.h:46
TSubclassOf()=default
TSubclassOf(const TSubclassOf< OtherT > &Other)
Definition SubclassOf.h:69
TSubclassOf(const TSubclassOf &)=default
TSubclassOf & operator=(UClass *From)
Definition SubclassOf.h:88
T ElementType
Definition SubclassOf.h:36
TSubclassOf & operator=(const TSubclassOf< OtherT > &Other)
Definition SubclassOf.h:80
UE_FORCEINLINE_HINT UClass * operator->() const
Definition SubclassOf.h:125
UE_FORCEINLINE_HINT UClass * Get() const
Definition SubclassOf.h:119
Definition Class.h:3793
UObject * GetDefaultObject(bool bCreateIfNeeded=true) const
Definition Class.h:4373
Definition Object.h:95
bool IsChildOf() const
Definition Class.h:788
Definition UnrealTypeTraits.h:267
Definition UnrealTypeTraits.h:283
Definition SubclassOf.h:16
@ Value
Definition SubclassOf.h:17
Definition ObjectPtr.h:488