当前位置: 首页 > 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); 
}

🦀🦀观看~~

相关文章:

  • 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. 非齊次方程組解的性質、非齊次方程組解的討論
  • 五大国货美妆去年业绩分化:珀莱雅百亿营收领跑,上海家化转亏
  • 五一去哪儿| 追着花期去旅行,“赏花经济”绽放文旅新活力
  • 上海“模速空间”:将形成人工智能“北斗七星”和群星态势
  • “即买即退”扩容提质,上海静安推出离境退税2.0版新政
  • 安徽省公安厅原副厅长刘海石主动投案,正接受审查调查
  • 民生访谈|宝妈宝爸、毕业生、骑手……上海如何为不同人群提供就业保障