UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Variant.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
7#include "Containers/Array.h"
9#include "Math/Color.h"
10#include "Math/IntPoint.h"
11#include "Misc/Timespan.h"
12#include "UObject/NameTypes.h"
13#include "Math/Vector2D.h"
14#include "Math/IntRect.h"
16#include "Math/IntVector.h"
17#include "Math/Vector.h"
18#include "Misc/DateTime.h"
19#include "Math/Box.h"
21#include "Math/Vector4.h"
22#include "Math/Plane.h"
23#include "Math/Rotator.h"
24#include "Math/Matrix.h"
25#include "Math/Quat.h"
26#include "Math/TwoVectors.h"
27#include "Math/Transform.h"
28#include "Misc/Guid.h"
29#include "Math/RandomStream.h"
30#include "Misc/NetworkGuid.h"
33
37enum class EVariantTypes : int32
38{
39 Empty = 0,
40 Ansichar = 1,
41 Bool = 2,
42 Box = 3,
44 ByteArray = 5,
45 Color = 6,
46 DateTime = 7,
47 Double = 8,
48 Enum = 9,
49 Float = 10,
50 Guid = 11,
51 Int8 = 12,
52 Int16 = 13,
53 Int32 = 14,
54 Int64 = 15,
55 IntRect = 16,
56 LinearColor = 17,
57 Matrix = 18,
58 Name = 19,
59 Plane = 20,
60 Quat = 21,
61 RandomStream = 22,
62 Rotator = 23,
63 String = 24,
64 Widechar = 25,
65 Timespan = 26,
66 Transform = 27,
67 TwoVectors = 28,
68 UInt8 = 29,
69 UInt16 = 30,
70 UInt32 = 31,
71 UInt64 = 32,
72 Vector = 33,
73 Vector2d = 34,
74 Vector4 = 35,
75 IntPoint = 36,
76 IntVector = 37,
77 NetworkGUID = 38,
78
79 Custom = 0x40
80};
81
82
96template<typename T> struct TVariantTraits
97{
98 static constexpr EVariantTypes GetType()
99 {
100 static_assert(!sizeof(T), "Variant trait must be specialized for this type.");
102 }
103};
104
105
114{
115public:
116
119 : Type(EVariantTypes::Empty)
120 { }
121
122 FVariant(const FVariant&) = default;
123 FVariant& operator=(const FVariant&) = default;
124 ~FVariant() = default;
125
127 : Type(Other.Type)
128 , Value(MoveTemp(Other.Value))
129 {
131 }
132
134 {
135 if (&Other != this)
136 {
137 Type = Other.Type;
138 Value = MoveTemp(Other.Value);
140 }
141 return *this;
142 }
143
149 template<typename T>
151 {
152 FMemoryWriter writer(Value, true);
153 writer << InValue;
154
156 }
157
168 : Type(EVariantTypes::ByteArray)
169 , Value(MoveTemp(InArray))
170 { }
172 : Type(EVariantTypes::ByteArray)
173 , Value(InArray)
174 { }
175
182 {
183 *this = FString(InString);
184 }
185
186public:
187
195 template<typename T>
197 {
198 FMemoryWriter Writer(Value, true);
199 Writer << InValue;
200
202
203 return *this;
204 }
205
217 {
219 Value = MoveTemp(InArray);
220
221 return *this;
222 }
224 {
226 Value = InArray;
227
228 return *this;
229 }
230
238 {
239 *this = FString(InString);
240
241 return *this;
242 }
243
244
251 template<typename T>
252 operator T() const
253 {
254 return GetValue<T>();
255 }
256
257public:
258
265 bool operator==( const FVariant& Other ) const
266 {
267 return ((Type == Other.Type) && (Value == Other.Value));
268 }
269
276 bool operator!=( const FVariant& Other ) const
277 {
278 return ((Type != Other.Type) || (Value != Other.Value));
279 }
280
281public:
282
288 void Empty()
289 {
291
292 Value.Empty();
293 }
294
302 bool IsEmpty() const
303 {
304 return (Type == EVariantTypes::Empty);
305 }
306
317 const TArray<uint8>& GetBytes() const
318 {
319 return Value;
320 }
321
329 {
330 return Value.Num();
331 }
332
340 {
341 return Type;
342 }
343
353 template<typename T>
354 T GetValue() const
355 {
357
358 T Result;
359
360 FMemoryReader Reader(Value, true);
361 Reader << Result;
362
363 return Result;
364 }
365
366public:
367
376 {
377 return Ar << Variant.Type << Variant.Value;
378 }
379
380private:
381
383 EVariantTypes Type;
384
386 TArray<uint8> Value;
387};
388
389
402template<>
403inline TArray<uint8> FVariant::GetValue<TArray<uint8> >() const
404{
406
407 return Value;
408}
409
410
411/* Default FVariant traits for built-in types
412 *****************************************************************************/
413
415template<> struct TVariantTraits<ANSICHAR>
416{
417 static constexpr EVariantTypes GetType() { return EVariantTypes::Ansichar; }
418};
419
420
422template<> struct TVariantTraits<bool>
423{
424 static constexpr EVariantTypes GetType() { return EVariantTypes::Bool; }
425};
426
427
429template<> struct TVariantTraits<FBox>
430{
431 static constexpr EVariantTypes GetType() { return EVariantTypes::Box; }
432};
433
434
437{
439};
440
441
443template<> struct TVariantTraits<TArray<uint8> >
444{
445 static constexpr EVariantTypes GetType() { return EVariantTypes::ByteArray; }
446};
447
448
450template<> struct TVariantTraits<FColor>
451{
452 static constexpr EVariantTypes GetType() { return EVariantTypes::Color; }
453};
454
455
457template<> struct TVariantTraits<FDateTime>
458{
459 static constexpr EVariantTypes GetType() { return EVariantTypes::DateTime; }
460};
461
462
464template<> struct TVariantTraits<double>
465{
466 static constexpr EVariantTypes GetType() { return EVariantTypes::Double; }
467};
468
469
471template<typename EnumType> struct TVariantTraits<TEnumAsByte<EnumType> >
472{
473 static constexpr EVariantTypes GetType() { return EVariantTypes::Enum; }
474};
475
476
478template<> struct TVariantTraits<float>
479{
480 static constexpr EVariantTypes GetType() { return EVariantTypes::Float; }
481};
482
483
485template<> struct TVariantTraits<FGuid>
486{
487 static constexpr EVariantTypes GetType() { return EVariantTypes::Guid; }
488};
489
490
492template<> struct TVariantTraits<int8>
493{
494 static constexpr EVariantTypes GetType() { return EVariantTypes::Int8; }
495};
496
497
499template<> struct TVariantTraits<int16>
500{
501 static constexpr EVariantTypes GetType() { return EVariantTypes::Int16; }
502};
503
504
506template<> struct TVariantTraits<int32>
507{
508 static constexpr EVariantTypes GetType() { return EVariantTypes::Int32; }
509};
510
511
513template<> struct TVariantTraits<int64>
514{
515 static constexpr EVariantTypes GetType() { return EVariantTypes::Int64; }
516};
517
518
520template<> struct TVariantTraits<FIntPoint>
521{
522 static constexpr EVariantTypes GetType() { return EVariantTypes::IntPoint; }
523};
524
525
527template<> struct TVariantTraits<FIntVector>
528{
529 static constexpr EVariantTypes GetType() { return EVariantTypes::IntVector; }
530};
531
532
534template<> struct TVariantTraits<FIntRect>
535{
536 static constexpr EVariantTypes GetType() { return EVariantTypes::IntRect; }
537};
538
539
541template<> struct TVariantTraits<FLinearColor>
542{
543 static constexpr EVariantTypes GetType() { return EVariantTypes::LinearColor; }
544};
545
546
548template<> struct TVariantTraits<FMatrix>
549{
550 static constexpr EVariantTypes GetType() { return EVariantTypes::Matrix; }
551};
552
553
555template<> struct TVariantTraits<FPlane>
556{
557 static constexpr EVariantTypes GetType() { return EVariantTypes::Plane; }
558};
559
560
562template<> struct TVariantTraits<FQuat>
563{
564 static constexpr EVariantTypes GetType() { return EVariantTypes::Quat; }
565};
566
567
569template<> struct TVariantTraits<FName>
570{
571 static constexpr EVariantTypes GetType() { return EVariantTypes::Name; }
572};
573
574
577{
578 static constexpr EVariantTypes GetType() { return EVariantTypes::RandomStream; }
579};
580
581
583template<> struct TVariantTraits<FRotator>
584{
585 static constexpr EVariantTypes GetType() { return EVariantTypes::Rotator; }
586};
587
588
590template<> struct TVariantTraits<FString>
591{
592 static constexpr EVariantTypes GetType() { return EVariantTypes::String; }
593};
594
595
597template<> struct TVariantTraits<WIDECHAR>
598{
599 static constexpr EVariantTypes GetType() { return EVariantTypes::Widechar; }
600};
601
602
604template<> struct TVariantTraits<FTimespan>
605{
606 static constexpr EVariantTypes GetType() { return EVariantTypes::Timespan; }
607};
608
609
611template<> struct TVariantTraits<FTransform>
612{
613 static constexpr EVariantTypes GetType() { return EVariantTypes::Transform; }
614};
615
616
618template<> struct TVariantTraits<FTwoVectors>
619{
620 static constexpr EVariantTypes GetType() { return EVariantTypes::TwoVectors; }
621};
622
623
625template<> struct TVariantTraits<uint8>
626{
627 static constexpr EVariantTypes GetType() { return EVariantTypes::UInt8; }
628};
629
630
632template<> struct TVariantTraits<uint16>
633{
634 static constexpr EVariantTypes GetType() { return EVariantTypes::UInt16; }
635};
636
637
639template<> struct TVariantTraits<uint32>
640{
641 static constexpr EVariantTypes GetType() { return EVariantTypes::UInt32; }
642};
643
644
646template<> struct TVariantTraits<uint64>
647{
648 static constexpr EVariantTypes GetType() { return EVariantTypes::UInt64; }
649};
650
651
653template<> struct TVariantTraits<FVector>
654{
655 static constexpr EVariantTypes GetType() { return EVariantTypes::Vector; }
656};
657
658
660template<> struct TVariantTraits<FVector2D>
661{
662 static constexpr EVariantTypes GetType() { return EVariantTypes::Vector2d; }
663};
664
665
667template<> struct TVariantTraits<FVector4>
668{
669 static constexpr EVariantTypes GetType() { return EVariantTypes::Vector4; }
670};
671
672
674template<> struct TVariantTraits<FNetworkGUID>
675{
676 static constexpr EVariantTypes GetType() { return EVariantTypes::NetworkGUID; }
677};
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int16 int16
A 16-bit signed integer.
Definition Platform.h:1123
FPlatformTypes::int8 int8
An 8-bit signed integer.
Definition Platform.h:1121
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::WIDECHAR WIDECHAR
A wide character. Normally a signed type.
Definition Platform.h:1133
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::ANSICHAR ANSICHAR
An ANSI character. Normally a signed type.
Definition Platform.h:1131
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
const bool
Definition NetworkReplayStreaming.h:178
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
EVariantTypes
Definition Variant.h:38
uint8_t uint8
Definition binka_ue_file_header.h:8
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
Definition MemoryReader.h:17
Definition MemoryWriter.h:101
Definition NameTypes.h:617
Definition NetworkGuid.h:12
Definition Variant.h:114
FVariant & operator=(T InValue)
Definition Variant.h:196
FVariant(T InValue)
Definition Variant.h:150
bool IsEmpty() const
Definition Variant.h:302
FVariant()
Definition Variant.h:118
EVariantTypes GetType() const
Definition Variant.h:339
FVariant(FVariant &&Other)
Definition Variant.h:126
const TArray< uint8 > & GetBytes() const
Definition Variant.h:317
FVariant & operator=(const TArray< uint8 > &InArray)
Definition Variant.h:223
FVariant & operator=(TArray< uint8 > &&InArray)
Definition Variant.h:216
void Empty()
Definition Variant.h:288
FVariant(const TArray< uint8 > &InArray)
Definition Variant.h:171
FVariant & operator=(FVariant &&Other)
Definition Variant.h:133
int32 GetSize() const
Definition Variant.h:328
bool operator==(const FVariant &Other) const
Definition Variant.h:265
FVariant(TArray< uint8 > &&InArray)
Definition Variant.h:167
bool operator!=(const FVariant &Other) const
Definition Variant.h:276
FVariant & operator=(const FVariant &)=default
~FVariant()=default
FVariant(const FVariant &)=default
friend FArchive & operator<<(FArchive &Ar, FVariant &Variant)
Definition Variant.h:375
FVariant & operator=(const TCHAR *InString)
Definition Variant.h:237
T GetValue() const
Definition Variant.h:354
FVariant(const TCHAR *InString)
Definition Variant.h:181
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
void Empty(SizeType Slack=0)
Definition Array.h:2273
Definition EnumAsByte.h:22
Definition Color.h:486
Definition DateTime.h:76
Definition Guid.h:109
Definition Color.h:48
Definition RandomStream.h:20
Definition Timespan.h:76
Definition TwoVectors.h:15
static constexpr EVariantTypes GetType()
Definition Variant.h:417
static constexpr EVariantTypes GetType()
Definition Variant.h:438
static constexpr EVariantTypes GetType()
Definition Variant.h:431
static constexpr EVariantTypes GetType()
Definition Variant.h:452
static constexpr EVariantTypes GetType()
Definition Variant.h:459
static constexpr EVariantTypes GetType()
Definition Variant.h:487
static constexpr EVariantTypes GetType()
Definition Variant.h:522
static constexpr EVariantTypes GetType()
Definition Variant.h:536
static constexpr EVariantTypes GetType()
Definition Variant.h:529
static constexpr EVariantTypes GetType()
Definition Variant.h:543
static constexpr EVariantTypes GetType()
Definition Variant.h:550
static constexpr EVariantTypes GetType()
Definition Variant.h:571
static constexpr EVariantTypes GetType()
Definition Variant.h:676
static constexpr EVariantTypes GetType()
Definition Variant.h:557
static constexpr EVariantTypes GetType()
Definition Variant.h:564
static constexpr EVariantTypes GetType()
Definition Variant.h:578
static constexpr EVariantTypes GetType()
Definition Variant.h:585
static constexpr EVariantTypes GetType()
Definition Variant.h:592
static constexpr EVariantTypes GetType()
Definition Variant.h:606
static constexpr EVariantTypes GetType()
Definition Variant.h:613
static constexpr EVariantTypes GetType()
Definition Variant.h:620
static constexpr EVariantTypes GetType()
Definition Variant.h:662
static constexpr EVariantTypes GetType()
Definition Variant.h:669
static constexpr EVariantTypes GetType()
Definition Variant.h:655
static constexpr EVariantTypes GetType()
Definition Variant.h:445
static constexpr EVariantTypes GetType()
Definition Variant.h:473
static constexpr EVariantTypes GetType()
Definition Variant.h:599
static constexpr EVariantTypes GetType()
Definition Variant.h:424
static constexpr EVariantTypes GetType()
Definition Variant.h:466
static constexpr EVariantTypes GetType()
Definition Variant.h:480
static constexpr EVariantTypes GetType()
Definition Variant.h:501
static constexpr EVariantTypes GetType()
Definition Variant.h:508
static constexpr EVariantTypes GetType()
Definition Variant.h:515
static constexpr EVariantTypes GetType()
Definition Variant.h:494
static constexpr EVariantTypes GetType()
Definition Variant.h:634
static constexpr EVariantTypes GetType()
Definition Variant.h:641
static constexpr EVariantTypes GetType()
Definition Variant.h:648
static constexpr EVariantTypes GetType()
Definition Variant.h:627
Definition Variant.h:97
static constexpr EVariantTypes GetType()
Definition Variant.h:98
Definition BoxSphereBounds.h:25
Definition IntPoint.h:25