ue4 lambda表达式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ue4 lambda表达式
Lambda表达式是C++11新增的重要特性之一。

它允许我们以紧凑和方便的方式定义匿名函数,并将其作为值传递和存储。

在Unreal Engine 4中,我们可以使用Lambda表达式来实现许多有用的功能,如事件绑定,延迟执行,搜索和过滤数据等。

在本文中,我将介绍Lambda表达式的语法和用法,并展示如何使用它们来简化UE4中的开发任务。

1. Lambda表达式的语法
Lambda表达式的基本语法如下:
[capture-list](parameter-list) -> return-type {function-body}
其中,capture-list表示我们想要捕获的变量列表;parameter-list表示函数参数列表;return-type表示返回值类型;function-body表示函数体。

下面是一个简单的Lambda表达式的例子:
auto sum = [](int x, int y) {return x + y;};
这个Lambda表达式将两个整数相加并返回它们的和。

我们可以使用auto关键字来自动推断返回类型。

我们也可以像普通函数一样调用它,例如:
int result = sum(3, 5); result = 8
2. 捕获列表
在Lambda表达式中,我们可以使用捕获列表来捕获外部变量。

捕获列表可以是如下形式之一:
- [ ] 空列表:表示不捕获任何外部变量。

- [var]:表示捕获var变量按值传递。

- [&var]:表示捕获var变量按引用传递。

- [=]:表示按值捕获外部所有可见变量。

- [&]:表示按引用捕获外部所有可见变量。

下面是一些Lambda表达式的例子,演示了不同的捕获方式:
int x = 3, y = 5;
auto add = [x, &y]() {return x + y;};
auto multiply = [=]() {return x * y;};
auto increment = [&]() {++x; ++y;};
在这里,add函数使用按值捕获x和按引用捕获y,在函数体中访问它们。

multiply函数使用按值捕获所有可见变量。

increment函数使用按引用捕获所有可见变量,并增加它们的值。

3. Lambdas作为参数和返回值
在UE4中,我们经常需要将Lambda表达式传递给函数作为参数或返回值。

例如,当我们需要在某些事件发生时执行某些操作时,使用Lambda表达式非常方便。

这时,我们可以采用以下方式来定义这些函数:
- 使用std::function类型
std::function类型是C++11中的一个通用函数包装器,允许我们以类型安全的方式存储Lambda表达式和其他函数。

在UE4中,我们经常使用std::function 类型来定义事件委托,其语法如下:
using FOnButtonClicked = std::function<void()>;
然后,我们可以通过定义一个Lambda表达式来绑定这个事件委托:
FOnButtonClicked OnButtonClicked = []() {UE_LOG(LogTemp, Warning, TEXT("Button clicked!"));};
最后,我们可以将其作为参数传递给其他函数,例如:
void RegisterButtonCallback(FOnButtonClicked OnClicked)
{
注册点击事件
}
- 使用TFunction类型
Unreal Engine 4还提供了TFunction类型,这是一个类似于std::function的轻量级函数包装器。

TFunction类型允许我们在不引入额外开销的情况下捕获外部变量。

在UE4中,我们经常使用TFunction类型来定义Lambda表达式作为委托。

下面是它的语法:
DECLARE_DELEGATE(FOnButtonClicked);
FOnButtonClicked::CreateLambda([]() {UE_LOG(LogTemp, Warning, TEXT("Button clicked!"));});
4. Lambda函数的高级用法
在UE4中,Lambda表达式还有一些高级用法,例如延迟执行,搜索和过滤数据。

下面是一些例子:
- 延迟执行
在UE4中,我们使用FTimerManager类来延迟执行代码。

我们可以使用Lambda表达式来定义要延迟执行的代码块,并将它们传递给FTimerManager 类的各种函数中。

下面是一个例子:
FTimerManager& TimerManager = GetWorld()->GetTimerManager(); TimerManager.SetTimerForOneSecond(FTimerDelegate::CreateLambda([ ](){ UE_LOG(LogTemp, Warning, TEXT("Delayed function executed!")); }));
在这个例子中,我们定义了一个Lambda表达式,在执行1秒后输出信息。

然后,我们将这个Lambda表达式传递给SetTimerForOneSecond函数。

- 搜索和过滤数据
在UE4中,我们经常需要在TArray或TMap等容器中搜索和过滤数据。

Lambda 函数很适合这种用法。

我们可以使用TArray::FilterByPredicate函数来过滤一个数组中的元素,并使用Lambda函数来定义过滤条件。

下面是一个例子:
TArray<int> Numbers = {1, 2, 3, 4, 5};
TArray<int> EvenNumbers = Numbers.FilterByPredicate([](int x) {return
x % 2 == 0;});
在这个例子中,我们定义了一个Lambda表达式,在一个数组中过滤出偶数值。

其他常用的Lambda表达式函数还包括TArray::Sort和TArray::Find等。

这些函数提供了一种可读性高、方便的方式来处理集合数据。

5. 总结
Lambda表达式是C++11中一个强大而方便的特性,尤其是在UE4中,它们可以大大简化许多开发任务。

在这篇文章中,我们介绍了Lambda表达式的语法和用法,包括捕获列表、Lambdas作为参数和返回值以及高级用法,如延迟执行和数据过滤。

在平时的UE4开发工作中,我们可以灵活运用Lambda表达式,来提高开发效率和代码可读性。

相关文档
最新文档