Представляет собой "ссылку" на массив с определенным количеством значений. Может быть полезно, когда TArray нужно передать в качестве С-типа массива. Или если функции, которая не будет удалять или добавлять значения к масиву. ВАЖНО! Поскольку работает как ссылка, нужно следить за временем жизни массива, из которого создавался тип. Поэтому р-валуе лучше не использовать.
Можно создавать 2-мся способами:
Просто передать массив. Тогда функция сама возьмет ссылку на него и количество элементов равное размеру массива:
ArrayView.h
/**
* Constructor from another range
*
* @param Other The source range to copy
*/
template <
typename OtherRangeType,
typename CVUnqualifiedOtherRangeType = typename TRemoveCV<typename TRemoveReference<OtherRangeType>::Type>::Type,
typename = typename TEnableIf<
TAnd<
TIsContiguousContainer<CVUnqualifiedOtherRangeType>,
TIsCompatibleRangeType<OtherRangeType>
>::Value
>::Type
>
FORCEINLINE TArrayView(OtherRangeType&& Other)
: DataPtr(ArrayViewPrivate::GetDataHelper(Forward<OtherRangeType>(Other)))
{
const auto InCount = GetNum(Forward<OtherRangeType>(Other));
check((InCount >= 0) && ((sizeof(InCount) < sizeof(SizeType)) || (InCount <= static_cast<decltype(InCount)>(TNumericLimits<SizeType>::Max()))));
ArrayNum = (SizeType)InCount;
}
template <
typename OtherRangeType,
typename CVUnqualifiedOtherRangeType = typename TRemoveCV<typename TRemoveReference<OtherRangeType>::Type>::Type,
typename = typename TEnableIf<TIsContiguousContainer<CVUnqualifiedOtherRangeType>::Value>::Type
>
auto MakeArrayView(OtherRangeType&& Other)
{
return TArrayView<typename TRemovePointer<decltype(GetData(DeclVal<OtherRangeType&>()))>::Type>(Forward<OtherRangeType>(Other));
}
2. Способ подразумевает, что пользователь сам даст ссылку на дату массива и количество его элементов. Полезно когда мы хотим взять только часть массива, но не хотим копировать его
ArrayView.h
/**
* Constructor.
*/
TArrayView()
: DataPtr(nullptr)
, ArrayNum(0)
{
}
template<typename ElementType>
auto MakeArrayView(ElementType* Pointer, int32 Size)
{
return TArrayView<ElementType>(Pointer, Size);
}
//...
// Например, если
auto Current = Storages.IndexOfByKey(ActiveSlot.Storage);
if (Current == INDEX_NONE)
{
Current = Storages.Num();
}
const auto lesser = MakeArrayView(Storages.GetData(), Current);