从 lambda 内部更改 bool
Changing bool on this from inside lambda
我在 AActor 上有一个 bool,我想从 lambda 函数更改它,我应该如何捕获 bool 以便实际更改它?我目前使用 [&],据我所知,它应该通过引用传递它,但是从 lambda 函数内部更改 bool 不会在 actor 上更改它。
[&] () { bMyBool = true; };
编辑 1:更多信息
bool 在 class 的 header 中定义为受保护。
protected:
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
bool bMagBoots;
我有一个将委托绑定到输入操作的函数,它应该调用 lambda。
void ASPCharacterActor::BindLambdaToAction(UInputComponent* InputComponent, FName ActionName,
EInputEvent InputEventType, TFunctionRef<void()> ActionHandler)
{
FInputActionHandlerSignature ActionHandlerSignature;
ActionHandlerSignature.BindLambda(ActionHandler);
FInputActionBinding ActionBinding = FInputActionBinding(ActionName, InputEventType);
ActionBinding.ActionDelegate = ActionHandlerSignature;
InputComponent->AddActionBinding(ActionBinding);
}
然后调用BeginPlay里面的函数。当我按下按钮时,lambda 被调用,但是 bool 不会在 lambda 函数之外改变。如果我在 lambda 中打印它,它确实发生了变化,所以我认为它只是被复制而不是被引用。
void ASPCharacterActor::BeginPlay()
{
Super::BeginPlay();
BindLambdaToAction(InputComponent, "MagBoots", IE_Pressed, [&]
{
bMagBoots = true;
});
}
我不知道你做了什么,但你的代码将通过在你的单个代码行周围使用以下环境来完成我们所期望的:
int main()
{
bool bMyBool = false;
auto l= [&] () { bMyBool = true; };
l();
std::cout << bMyBool << std::endl;
}
正如您在编辑中提到的那样,您在 class 上下文中使用它:
// Same in class context:
class X
{
private:
bool bMyBool = false;
std::function<void(void)> lam;
public:
void CreateAndStoreLambda()
{
lam= [&] () { bMyBool = true; };
// or you can capture this to access all vars of the instance like:
// lam= [this] () { bMyBool = true; };
}
void CallLambda()
{
lam();
std::cout << bMyBool << std::endl;
}
};
int main()
{
X x;
x.CreateAndStoreLambda();
x.CallLambda();
}
我在 AActor 上有一个 bool,我想从 lambda 函数更改它,我应该如何捕获 bool 以便实际更改它?我目前使用 [&],据我所知,它应该通过引用传递它,但是从 lambda 函数内部更改 bool 不会在 actor 上更改它。
[&] () { bMyBool = true; };
编辑 1:更多信息
bool 在 class 的 header 中定义为受保护。
protected:
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
bool bMagBoots;
我有一个将委托绑定到输入操作的函数,它应该调用 lambda。
void ASPCharacterActor::BindLambdaToAction(UInputComponent* InputComponent, FName ActionName,
EInputEvent InputEventType, TFunctionRef<void()> ActionHandler)
{
FInputActionHandlerSignature ActionHandlerSignature;
ActionHandlerSignature.BindLambda(ActionHandler);
FInputActionBinding ActionBinding = FInputActionBinding(ActionName, InputEventType);
ActionBinding.ActionDelegate = ActionHandlerSignature;
InputComponent->AddActionBinding(ActionBinding);
}
然后调用BeginPlay里面的函数。当我按下按钮时,lambda 被调用,但是 bool 不会在 lambda 函数之外改变。如果我在 lambda 中打印它,它确实发生了变化,所以我认为它只是被复制而不是被引用。
void ASPCharacterActor::BeginPlay()
{
Super::BeginPlay();
BindLambdaToAction(InputComponent, "MagBoots", IE_Pressed, [&]
{
bMagBoots = true;
});
}
我不知道你做了什么,但你的代码将通过在你的单个代码行周围使用以下环境来完成我们所期望的:
int main()
{
bool bMyBool = false;
auto l= [&] () { bMyBool = true; };
l();
std::cout << bMyBool << std::endl;
}
正如您在编辑中提到的那样,您在 class 上下文中使用它:
// Same in class context:
class X
{
private:
bool bMyBool = false;
std::function<void(void)> lam;
public:
void CreateAndStoreLambda()
{
lam= [&] () { bMyBool = true; };
// or you can capture this to access all vars of the instance like:
// lam= [this] () { bMyBool = true; };
}
void CallLambda()
{
lam();
std::cout << bMyBool << std::endl;
}
};
int main()
{
X x;
x.CreateAndStoreLambda();
x.CallLambda();
}