Редкие типы UE C++

TArrayView

Представляет собой "ссылку" на массив с определенным количеством значений. Может быть полезно, когда TArray нужно передать в качестве С-типа массива. Или если функции, которая не будет удалять или добавлять значения к масиву. ВАЖНО! Поскольку работает как ссылка, нужно следить за временем жизни массива, из которого создавался тип. Поэтому р-валуе лучше не использовать.

Можно создавать 2-мся способами:

  1. Просто передать массив. Тогда функция сама возьмет ссылку на него и количество элементов равное размеру массива:

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);

Last updated

Was this helpful?