Unreal Engine 5.2, Enum, TMap, TFunction

Задача, нужно найти наиболее приоритетную цель. Проблема в использовании TMap в Unreal Engine 5.2.

Есть enum

UENUM()
enum class ETargetSelectionStrategy : uint8
{
    Distance UMETA(DisplayName = "By Distance"),
    MaxHP UMETA(DisplayName = "By Maximum HP"),
    MinHP UMETA(DisplayName = "By Current HP"),
    Priority UMETA(DisplayName = "By Priority")
};

Есть также поле стратегии, которое определяется с едитора

UPROPERTY(EditAnywhere, Category="Target class")
ETargetSelectionStrategy SelectionStrategy;

также, у меня есть TMap, которая выглядит как-то так

TMap<ETargetSelectionStrategy, TFunction<ATurretPawn*(ATurretPawn*)>> StrategyMap
{
 {ETargetSelectionStrategy::Distance, &ATowerPawn::DistanceStrategy},
 {ETargetSelectionStrategy::MaxHP, &ATowerPawn::MaxHPStrategy},
 {ETargetSelectionStrategy::MinHP, &ATowerPawn::MinHPStrategy},
 {ETargetSelectionStrategy::Priority, &ATowerPawn::PriorityStrategy}
};

И когда я пытаюсь вызвать метод в зависимости от стратегии

void ATowerPawn::SetTargetByStrategy()
{

    if (!StrategyMap.Contains(SelectionStrategy))
    {
        ensureMsgf(false, TEXT("The find target strategy %d is missed"),
                   static_cast<int32>(SelectionStrategy));
        return;
    }
    
    ATurretPawn* Target = StrategyMap[SelectionStrategy](this);

    if (Target && Target != CurrentTarget)
    {
        SetTarget(Target);
    }
}

У меня срабатывает следующая ошибка

[C2664] "ValueType &TMapBase<KeyType,ValueType,SetAllocator,KeyFuncs>::Add(const KeyType &,const ValueType &)": невозможно преобразовать аргумент 2 из "ATurretPawn (__cdecl ATowerPawn:: )(void)" в "const ValueType &"

Почему это не работает в таком виде, и как это исправить?

p.s. работает, если заменить реализацию TFunction на лямбду, но лямбда не интересует

Рабочий вариант

StrategyMap.Add(ETargetSelectionStrategy::Distance, [this]() -> ATurretPawn* { return this->DistanceStrategy(Arg); });

Ответы (1 шт):

Автор решения: Dima Shevchenko

как оказалось, ошибка были в сигнатуре метода, скрытый this должен был быть таким же, как и текущий клас, то есть

TMap<ETargetSelectionStrategy, TFunction<ATurretPawn*(ATowerPawn*)>> StrategyMap
→ Ссылка