函数包装器和lambda表达式

简介: 函数包装器和lambda表达式

函数包装器

使用:

1.头文件 functional

2. function<函数返回值类型(参数类型)> 对象(函数名)

当然对象也可以通过赋值的操作

作用:提供一个类型的公共接口,方便使用模板

包装一般的函数

#include<iostream>
#include<functional>
using namespace std;
int Max(int a, int b)
{
  return a > b ? a : b;
}
int main()
{
  function<int(int, int)> FuncMax(Max);
  cout << FuncMax(1, 2) << endl;
  system("pause");
  return 0;
}

包装静态成员函数

#include<iostream>
#include<string>
#include<functional>
using namespace std;
class MM
{
public:
  static void fun(int a, int b)
  {
    cout << a + b << endl;
  }
};
int main()
{
  function<void(int, int)> funct(MM::fun); 
  funct(2, 2);
  function<void(int, int)> functi = &MM::fun;//也可以通过赋值的操作
  functi(3, 5);
  system("pause");
  return 0;
}

包装仿函数

仿函数的参数一般用const来修饰

#include <functional>
#include <string>
#include <iostream>
using namespace std;
class Test
{
public:
  void operator()(const string& str)
  {
    cout << str << endl;
  }
};
int main()
{
  //3.包装仿函数
  Test test;
  function<void(const string&)> Func = test;
  Func("仿函数");
  test("仿函数");
  return 0;
}

包装隐式转换的对象

#include<iostream>
#include<string>
#include<functional>
using namespace std;
using func = void(*) (int, int); //取别名
//类型与fun函数类型一样
class MM
{
public:
  static void fun(int a, int b)
  {
    cout << a + b << endl;
  }
  operator func()
  {
    return fun;
  }
};
int main()
{
  //包含隐式转换的对象
  MM mm;
  function<void(int, int)> ff = mm;
  ff(2, 4);
  system("pasue");
  return 0;
}
#lambda表达式
> lambda表达式得到的结果是一个函数指针,并且函数指针指向和赋值都一步到位了。
## lambda表达式的写法
```cpp
写法:
[捕获方式](参数列表)mutable noexcept->函数返回值类型{函数体;}
使用的时候:直接使用auto类型推断类型接受1.lambda表达式的返回值
2.使用的时候除了捕获方式和函数之外,所有的东西都可以省略
捕获的方式:指的是lambda函数体使用之外的变量的方式
[] 不捕获任何东西
[=] 用值的方式
[&] 引用的方式
[this] 成员函数
[&value] value用的引用的方式
[=, &value] value用的引用的方式,其他变量用值的方式

lambda表达式的基本操作

1.学会使用一个完成版的lambda表达式

2.用lambda表达式调用函数

3.lambda缺省的写法

4.lambda捕获方式区别

完整写法

include<iostream>
#include<string>
using namespace std;
int main()
{
  int a = 2, b = 5;
  auto fun = [](int a, int b) mutable noexcept->int{ return a > b ? a : b; };
  cout << fun(a, b) << endl;
  //写到一起
  cout << [](int a, int b) mutable noexcept -> int {return a > b ? a : b; }(a, b) << endl;;
  system("pause");
  return 0;
}

缺省写法(以及=和&捕获方式的区别)

#include<iostream>
#include<string>
using namespace std;
int main()
{
  int a = 4, b = 9;
  cout << [](int a, int b) {return a > b ? a : b; }(a, b) << endl;
  cout << [=] {return a > b ? a : b; }() << endl;
  //=捕获方式不改变值的大小
  b = 19;
  cout << [=] {return a > b ? a : b; }() << endl;
  //&捕获方式改变值的大小
  b = 19;
  cout << [&] {return a > b ? a : b; }() << endl;
  system("pause");
  return 0;
}

this捕获方式

#include<iostream>
#include<string>
using namespace std;
class MM
{
public:
  MM() = default;
  void printDate()
  {
    cout << [this]()-> int {return this->age++; }() << endl;
  }
private:
  int age = 10 ;
  string name;
};
int main()
{
  MM mm;
  mm.printDate();
  system("pause");
  return 0;
}

lambda可以用在以函数指针充当函数参数的地方

一般结合算法或者函数使用

这里举了2个例子,find_if算法和for_each算法

算法后续会介绍

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
  vector<int> date = { 3, 1, 4, 5, 1, 9 };
  for_each(date.begin(), date.end(), [](int date) {cout << date; });
  cout << endl;
  cout << *find_if(date.begin(), date.end(), [](int date) {return date == 5; }) << endl;
  return 0;
}


相关文章
|
8天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
3702 8
|
4天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
14天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
16天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2377 18
|
8天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1237 5
|
7天前
|
人工智能 运维 前端开发
Claude Code 30k+ star官方插件,小白也能写专业级代码
Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。
|
3天前
|
人工智能 前端开发 安全
Claude Code这周这波更新有点猛,一次性给你讲清楚
Claude Code 2.1.19重磅更新:7天连发8版!npm安装已弃用,全面转向更安全稳定的原生安装(brew/curl/WinGet等)。新增bash历史补全、自定义快捷键、任务依赖追踪、搜索过滤等功能,并修复内存泄漏、崩溃及多项安全漏洞。老用户建议尽快迁移。
|
18天前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
1386 106