# TTuple: использование в шаблонах

## Основные функции для работы

#### Создается TTuple

```cpp
template<class... OperationTypes>
	void Run(OperationTypes&&... Operations)
	{
		MakeTuple(MoveTemp(Operations)...);
	}
```

#### Трансформирование TTuple

Идея в том, что у нас есть функция-обработчик и TTuple с набором переменных. Обработчику передается поочереди каждая переменная (из TTuple) одного типа, на что обработчик может вернуть переменную абсолютно другого типа. Таким образом сделав новую TTuple, совершенно с другим набором параметров и их значений.&#x20;

```cpp
/**
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); });
}
```

Полезно когда мы хотим объединить две функции вместе. Передав в виде тупле набор лямбд, мы отправим их в обработчик, который поместит их в другую лямбду-обертку. Которая запустит их уже лишь при определенных условиях.

```cpp
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-ой элемент каждой Тупле и т.д.&#x20;

```cpp
/**
 * 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` и передать их на посещение. Таким образом мы просто запустим функцию с любым количеством любых типов переменных. &#x20;
