Sometimes we want to iterate over enum values.
In the Unreal Engine, We already have macros about making rages for UENUM.
First, Let’s make a test enum type.
UENUM(BlueprintType)
enum class ETest : uint8
{
ZERO,
FIRST,
SECOND,
THIRD,
FOURTH,
FIFTH
};
That looks decent enum type.
We also need to print the enum value name for the test.
template<typename TEnum>
static FString EnumToString(const FString& Name, TEnum Value)
{
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, *Name, true);
if (UNLIKELY(!IsValid(EnumPtr)))
return FString("Invalid");
return EnumPtr->GetNameStringByValue((int32)Value);
}

Okay, I think we’re ready! Let’s get into the topic.
There are 3 types of enum range macro.
ENUM_RANGE_BY_COUNT
This is a simple one.
It makes iterator range from the initial value to counted value.
If we declare a range like below, We’ll Iterator 3 elements from the initial value.
ENUM_RANGE_BY_COUNT(ETest, 3);
Now we can iterate UENUM value with TEnumRange<> like this.
for (ETest Iter : TEnumRange<ETest>())
{
GEngine->AddOnScreenDebugMessage(-1, 999.f, FColor::Cyan, EnumToString<ETest>("ETest",Iter));
}
You can see that we print only 3 elements.
ENUM_RANGE_BY_FIRST_AND_LAST
This version allows us to set the range scope ourselves.
If we declare a range like below, We’ll Iterator elements that from value to value.
from 2(ETest::SECOND) to 5(ETest::FIFTH)
ENUM_RANGE_BY_FIRST_AND_LAST(ETest, 2, 5);

You can see that we print from 2 to 5 value.
ENUM_RANGE_BY_VALUES
This version is quite interesting.
Let’s say we make our enum values non-contiguous like this.
UENUM(BlueprintType)
enum class ETest : uint8
{
ZERO = 0,
FIRST = 3,
SECOND = 5,
THIRD = 10,
FOURTH = 99,
FIFTH = 128
};
We can’t use the macro that was explained before. Because this enum is non-contiguous.
If we declare macro like below, We’ll Iterator non-contiguous enum range with specific individual values.
ENUM_RANGE_BY_VALUES(ETest, ETest::FIRST, ETest::FOURTH);

If you want to go deeper
You can find more details on these macro in EnumRange.h
Engine\Source\Runtime\Core\Public\Misc\EnumRange.h