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 шт):
как оказалось, ошибка были в сигнатуре метода, скрытый this должен был быть таким же, как и текущий клас, то есть
TMap<ETargetSelectionStrategy, TFunction<ATurretPawn*(ATowerPawn*)>> StrategyMap