In the Unreal Engine 4 code base, we have started taking advantage of some of the cool features added in C++11. We are cautious when adopting new language features because we target a wide range of platforms with varying compiler support. One of my favorite new features though is 'range-based for loops', which now works on Unreal's TArray, TMap and TSet containers. Here is an example of how this can really clean up common game code. Previously if I wanted to iterate over an array of AActor* pointers, it used to look like:
TArray<AActor*> Actors; for (int32 ActorIndex=0; ActorIndex<Actors.Num(); ActorsIndex++) { AActor* Actor = Actors[ActorIndex]; Actor->SetActorLocation(NewLocation); }
But using the 'range-based for loop' syntax it now looks like:
TArray<AActor*> Actors; for (AActor* Actor : Actors) { Actor->SetActorLocation(NewLocation); }
How nice is that! Here is another example with a TMap – it used to look like this:
TMap<AActor*, FMyStruct> ActorStructs; for (auto ActorStructIt = ActorStructs.CreateIterator(); ActorStructIt; ++ActorStructIt) { AActor* Actor = ActorStructIt.Key(); FMyStruct& Data = ActorStructIt.Value(); }
But now it looks like:
TMap<AActor*, FMyStruct> ActorStructs; for (const auto& Entry : ActorStructs) { AActor* Actor = Entry.Key; const FMyStruct& Data = Entry.Value; }
Note that you are still responsible for putting 'const' or '&' on the variable you declare e.g.
TArray<FVector> Positions; for (FVector& Position : Positions) { Position.z += 10.f; }
You need to add the ‘&’ to have a reference to rather than a copy of the FVector. We are not going to start reformatting every for loop in the engine, but I certainly plan to use this syntax a lot going forward.
I’d love to hear what you guys think about this feature and answer any questions you might have. Be sure to find me over on Twitter at @EpicJamesG or in the forums!