Идея в том, что у нас есть функция-обработчик и TTuple с набором переменных. Обработчику передается поочереди каждая переменная (из TTuple) одного типа, на что обработчик может вернуть переменную абсолютно другого типа. Таким образом сделав новую TTuple, совершенно с другим набором параметров и их значений.
/**
Creates a new TTuple by applying a functor to each of the elements.
*
@param Tuple The tuple to apply the functor to.
@param Func The functor to apply.
*
@return A new tuple of the transformed elements.
*
Example:
*
float Overloaded(int32 Arg);
char Overloaded(const TCHAR* Arg);
const TCHAR* Overloaded(const FString& Arg);
*/
void Func(const TTuple& MyTuple)
{
// Equivalent to:
// TTuple TransformedTuple(Overloaded(MyTuple.Get()), Overloaded(MyTuple.Get()), Overloaded(MyTuple.Get())));
auto TransformedTuple = TransformTuple(MyTuple, { return Overloaded(Arg); });
}
Полезно когда мы хотим объединить две функции вместе. Передав в виде тупле набор лямбд, мы отправим их в обработчик, который поместит их в другую лямбду-обертку. Которая запустит их уже лишь при определенных условиях.
auto timed = TransformTuple(MakeTuple(MoveTemp(Operations)...), [=](auto&& Operation) {
return [=]() mutable {
if (bTimedOut)
{
AddError(TEXT("Timed out."));
}
else if (!Operation()) //Функция внутри обертки
{
return false;
}
return true;
};
});
Посещение элементов TTuple
Есть функция, и несколько Тупле с одинаковым количеством переменных. Функция берет по очереди 1-ый элемент каждого из Тупле, и передает их в функцию. Затем 2-ой элемент каждой Тупле и т.д.
/**
* Visits each element in the specified tuples in parallel and applies them as arguments to the functor.
* All specified tuples must have the same number of elements.
*
* @param Func The functor to apply.
* @param Tuples The tuples whose elements are to be applied to the functor.
*
* Example:
*/
void Func(const TTuple<int32, const TCHAR*, FString>& Tuple1, const TTuple<bool, float, FName>& Tuple2)
{
// Equivalent to:
// Functor(Tuple1.Get<0>(), Tuple2.Get<0>());
// Functor(Tuple1.Get<1>(), Tuple2.Get<1>());
// Functor(Tuple1.Get<2>(), Tuple2.Get<2>());
VisitTupleElements(Functor, Tuple1, Tuple2);
}
Не обязательно передавать несколько Тупле. Можно развернуть элементы свертки шаблона (...) через MakeTuple и передать их на посещение. Таким образом мы просто запустим функцию с любым количеством любых типов переменных.