当前位置: 首页 > news >正文

C++11之包装器

C++11 包装器

函数指针与回调函数

对于函数而言,函数名即函数指针,使用同类型的函数指针变量,可以实现对其所指向的函数进行传递。

void func1(int a, int b);
....
void func8(int a, int b);

void doSomething(void(*func)(int, int), int a, int b)
{
    ...
    func(a, b);
    ...
}

doSomething函数中,func回调函数,通过函数指针进行传递并调用。

可以根据传入的函数指针来进行不同的操作,而不用关心具体的func功能。


std::function

使用需要 functional 头文件

std::function 是一个通用的可调用对象的封装。

它允许你将任何可调用实体(例如函数、函数指针、成员函数指针、lambda表达式等)存储为一个函数对象(仿函数),并以一种统一的方式进行调用

void myFunc(int x);

class MyClass
{
public:
    void myFunc(int x);
    static void stFunc(int x);
};

//仿函数
class MyFunc
{
public:
    void operator()(int x);
};


//普通函数
std::function<void(int)> func1(myFunc);

//普通成员函数,不要忘记this指针
std::function<void(MyClass&,int)> func2(&MyClass::myFunc);

//静态成员函数
std::function<void(int)> func3(MyClass::stFunc);

//仿函数
std::function<void(int)> func4(MyFunc());

//lambda表达式
std::function<void(int)> func5([](int x)->void {});

对于std::function对象的使用,根据其参数列表进行类似仿函数的使用方式即可

//普通函数
func1(2023);

//普通成员函数
MyClass my;
func2(&my, 7);

//静态成员函数
func3(27);

//仿函数
func4(13);

//lambda表达式
func5(34);

std::bind

std::bind是一个函数模板,用于创建一个新的可调用对象,并绑定到特定的参数或对象。

可以通过 std::bind 将可调用实体与特定的参数绑定在一起,生成一个新的函数对象。这在需要更改函数签名或固定部分参数时非常有用。

请添加图片描述


绑定普通函数:

void myFunc(int x, int y);

									//使用std::bind绑定y为27
auto bindFunc = std::bind(myFunc, std::placeholders::_1, 27);

bindFunc(7);

上述中,使用std::bindmyFunc与第二个参数27绑定在一起,生成新的函数对象bindFunc

_1:是占位符,用于表示调用时传入的参数, 表示调用时的第一个参数。

_2, _3, …同理


绑定成员函数示例:

class MyClass
{
public:
    void myFunc(int x);
};

MyClass my;
std::function<void(int)> func = std::bind(&MyClass::myFunc, &my, std::placeholders::_1);

func(2023); //绑定到对象my, 相当于my.myFunc(2023)

Lambda替代bind

void myFunc(int x, int y);

									//绑定y为27
auto bindFunc = [](int x) { myFunc(x, 27)};

bindFunc(7);

#include <iostream>
#include <functional>

class MyClass
{
public:
    void myFunc(int x){
        cout << x << endl;
    }
};

int main()
{
    MyClass my;
    std::function<void(int)> func = [&my](int x)->void { my.myFunc(x)};

    func(2023); 
}

🦀🦀观看~~

http://www.dtcms.com/a/83858.html

相关文章:

  • TensorFlow快速介绍
  • javaweb开发以及部署
  • Winform在工控行业对比Wpf的优势?
  • C语言【文件操作】详解中
  • ASP.NET Web的 Razor Pages应用,配置热重载,解决.NET Core MVC 页面在更改后不刷新
  • 细说卫星导航:测距定位原理
  • Linux-Ubuntu 系统学习笔记 | 从入门到实战
  • C# 调用 VITS,推理模型 将文字转wav音频调试 -数字人分支
  • Leetcode 刷题笔记1 图论part04
  • [思考记录]两则:宏观视角、理想化
  • #echarts#折线图#饼图
  • @JsonSerialize注解
  • 机器臂运动控制算法工程师面试
  • LVGL常用功能备忘
  • STM32基础教程——定时器
  • 天梯赛 L2-013 红色警报
  • 2025海外华文新媒体高级人才研修班在广西南宁举办
  • Java实体类(Javabean)-编程规范
  • 自动学习和优化过程,实现更加精准的预测和决策的智慧交通开源了
  • 神聖的綫性代數速成例題13. 非齊次方程組解的性質、非齊次方程組解的討論
  • python:music21 构建 LSTM+GAN 模型生成爵士风格音乐
  • [笔记] TinyWebServer编译及demo运行过程
  • 什么是PHP伪协议
  • 详细解释计算机系统中的大小端
  • Unity摄像机基本操作详解:移动、旋转与缩放
  • qt实现一个简单http服务器和客户端
  • 前端(vue)学习笔记(CLASS 5):自定义指令插槽路由
  • 熔断降级(Sentinel解决)
  • 在OpenGL ES中将值传入shader的方法总结
  • 一条不太简单的TEX学习之路