c++中function和lambda函数的学习
在C++中,
std::function
是一个通用的函数封装器,可以用于存储、传递和调用任何可调用对象,如函数、函数指针、成员函数指针、lambda 表达式等。当std::function对象实例未包含任何实际可调用实体时,调用该std::function对象实例将抛出std::bad_function_call异常。以下是一些基本用法示例:
#include <iostream>
#include <functional>
// 定义一个普通函数
int add(int a, int b) {
return a + b;
}
// 定义一个函数对象(仿函数)
struct Multiply {
int operator()(int a, int b) {
return a * b;
}
};
int main() {
// 使用 std::function 存储普通函数
std::function<int(int, int)> func1 = add;
std::cout << "func1(2, 3): " << func1(2, 3) << std::endl;
// 使用 std::function 存储 lambda 表达式
auto lambda = [](int a, int b) { return a - b; };
std::function<int(int, int)> func2 = lambda;
std::cout << "func2(5, 2): " << func2(5, 2) << std::endl;
// 使用 std::function 存储函数对象(仿函数)
std::function<int(int, int)> func3 = Multiply();
std::cout << "func3(4, 6): " << func3(4, 6) << std::endl;
return 0;
}
在这个例子中,
std::function
的模板参数是函数的签名,即函数的参数类型和返回类型。然后,可以将不同类型的可调用对象赋值给std::function
对象,然后通过该对象调用对应的函数。
?c++11引入了Lambda表达式,使得开发人员可以更方便的创建匿名函数。Lambda表达式是c++语言的一个重要特性,它可以作为函数对象使用,可以用来替代一些繁琐的函数声明和定义。
Lambda函数表达式的结构如下:
[capture list] (parameter list) specifiers exception -> type { function body }
?
[capture list]是捕获列表,在应用中必填。
(parameter list)是参数列表,在应用中选填。
specifiers是限定符,在应用中选填。
exception是异常说明符,在应用中选填。
-> type是返回值类型,在应用中选填。
{ function body }是表达式的函数体,在应用中必填。
?捕获列表可以为空,也可以包含一个或多个捕获项。捕获项有两种形式:按值捕获和按引用捕获。
按值捕获
在这个例子中,
[x]
表示按值捕获变量x
。Lambda 表达式内部使用x
,但不修改外部的x
。int x = 10; auto lambda_by_value = [x]() { // 使用 x,但不修改 x std::cout << x << std::endl; };
按引用捕获
在这个例子中,
[&y]
表示按引用捕获变量y
。Lambda 表达式内部修改了外部的y
。int y = 20; auto lambda_by_reference = [&y]() { // 修改外部的 y y++; std::cout << y << std::endl; };
混合捕获
int a = 5; int b = 3; auto lambda_mixed = [a, &b]() { // 使用 a,但不修改 a;修改外部的 b std::cout << a << ", " << b << std::endl; };
此外,还可以使用
=
表示按值捕获所有外部变量,使用&
表示按引用捕获所有外部变量。int c = 7; int d = 9; auto lambda_capture_all_by_value = [=]() { // 使用 c 和 d,但不修改它们 std::cout << c << ", " << d << std::endl; }; auto lambda_capture_all_by_reference = [&]() { // 修改外部的 c 和 d c++; d++; std::cout << c << ", " << d << std::endl; };
Lambda表达式的参数列表与普通函数参数列表一致;如果不需要参数,则可以省略此项。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!