如何通过指针将模板成员函数传递给另一个成员函数?

时间:2018-07-15 02:09:28

标签: c++ unreal-engine4

我希望能够传递小部件类型及其动作的映射以及对我在下面的示例中显示的模板成员函数的引用,以便能够以简单的方式处理绑定数据驱动的循环。我做了一些尝试,但无法弄清楚如何将模板函数作为没有参数的函数指针传递。

(我也愿意就如何在c ++中实现这一点接受其他建议)

void AVRPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) {

  Super::SetupPlayerInputComponent(PlayerInputComponent);

  PlayerInputComponent->BindAction(LP_Constant::TRIGGER_PRESS_RIGHT_ACTION, IE_Pressed, this, &AVRPawn::TriggerPressed<IE_Pressed, ESide::Right>);
  PlayerInputComponent->BindAction(LP_Constant::TRIGGER_PRESS_RIGHT_ACTION, IE_Released, this, &AVRPawn::TriggerPressed<IE_Released, ESide::Right>);
  PlayerInputComponent->BindAction(LP_Constant::TRIGGER_PRESS_LEFT_ACTION, IE_Pressed, this, &AVRPawn::TriggerPressed<IE_Pressed, ESide::Left>);
  PlayerInputComponent->BindAction(LP_Constant::TRIGGER_PRESS_LEFT_ACTION, IE_Released, this, &AVRPawn::TriggerPressed<IE_Released, ESide::Left>);
}

在javascript中,我将创建一个简单的高阶函数来封装不同的数据,但是我很难找到一种雄辩的方法来用c ++做到这一点。

1 个答案:

答案 0 :(得分:0)

因此,我对此的解决方案最终不是基于模板的。这是UE4框架的局限性,或更确切地说,是我缺乏深入的了解。我最终遇到了一种绑定lambda回调的方法,该方法会将Action和Event传递给该回调。

void AVRPawn::BindPressableInput(UInputComponent* InputComponent) {
  for (auto const& Controller : MotionControllers) {
    for (auto const& Action : Controller->GetInputActions()) {
      for (auto const& Event : PressAndReleaseEvents) {
        FInputActionBinding Binding(Action, Event);
        Binding.ActionDelegate.GetDelegateForManualSet().BindLambda([=, &Controller]() {
          Controller->HandleInputEvent(Action, Event);
        });
        InputComponent->AddActionBinding(Binding);
      }
    }
  }
}

void AVRPawn::SetupPlayerInputComponent(UInputComponent* InputComponent) {
  Super::SetupPlayerInputComponent(InputComponent);
  BindPressableInput(InputComponent);
}