〇、前言
刚刚从C语言转到C++,最不习惯的是C++下有很多库、模板等功能,改变了以前什么都自己写的局面。但是也存在很多要学习的地方,需要多练习,多总结。
什么是函数包装器,其实就是用来存放函数指针,稍后调用,c里面的回调函数功能。一般在异步的过程中会比较多,比如定时器,可以参考一下伪代码。
//伪代码
//定时器的回调函数
void handler()
{
//do something
}
//设置定时器的时间和函数
timer.t = 1000;
timer.func = handler;
//时间到了以后自动调用hanler
timer.func();
一、包装器function
模板function是在头文件functional中声明的,它可以包装特征标相同的函数指针、函数对象或lambda表达式,从而进行调用。
二、实验
2.1 代码
/*************************************************************************
> File Name: main.c
> Author: JayTan
> Mail: jay.tan.guizhou@gmail.com
> Created Time:
************************************************************************/
#include <iostream>
#include <functional>
using namespace std;
//函数对象
class AddFunc
{
public:
AddFunc(int m):more(m){
}
int operator()(int a,int b){ return a + b + more;}
private:
int more;
};
//函数
int add_two_nomal(int a, int b)
{
return a+b;
}
int main(int argc, char** argv)
{
//包装函数
function<int(int, int)> func1 = add_two_nomal;
//包装lambda函数
function<int(int, int)> func2 = [](int a, int b){ return a+b+10;};
//包装函数对象
function<int(int, int)> func3 = AddFunc(20);
cout<< "add_two_nomal: 10 + 20 = " << func1(10, 20) <<endl;
cout<< "lambda: 10 + 20 = " << func2(10, 20) <<endl;
cout<< "AddFunc: 10 + 20 = " << func3(10, 20) <<endl;
return 0;
}
2.2 编译
g++ main.c -o test
2.3 结果
# ./test
add_two_nomal: 10 + 20 = 30
lambda: 10 + 20 = 40
AddFunc: 10 + 20 = 50
三、结论
function可以包装特征标相同的函数指针、函数对象或lambda表达式。
注释:
特征标:官方解释没找到,自己的理解就是参数一样的函数。
参考:
《C++ primer Plus》(第6版)