前提
首先需要包括头文件#include<functional>
基本使用格式
function<返回值类型(参数类型1,参数类型2,...)> 函数名称=实例化函数名称
函数名称(变量1,变量2,...)
- 用函数对象实例化function:函数是一种对象,所以可以作为类型来实例化。这种做法通常被称为“函数实例化”或者“函数构造”
- 什么是实例化:实例化(Instantiation)是面向对象编程中的一个过程,指的是根据类模板(Class)创建一个具体的对象(Object)。
- 在实例化过程中,程序会为类分配内存空间,并在该内存空间中创建一个具有特定属性和方法的对象,这样就可以通过该对象来访问类的属性和方法。
- 用函数实例化function有什么好处:
std::function
是 C++ 标准库提供的一个通用的函数封装类,用于将函数、函数指针、成员函数以及函数对象(包括仿函数)等封装成一个对象,从而可以像普通对象一样进行复制、赋值和传递。
一般有以下6种函数对象可以实例化function
普通函数 | |
类中成员函数 | 定义在class类中的函数 |
lambda函数 | lambda 函数比较轻便,即用即删除,很适合需要完成一项功能,但是此功能只在此一处使用, 连名字都很随意的情况下 |
仿函数 | 仿函数(Functor)是一个类或结构体,它实现了函数调用运算符 operator() ,使得该类的实例对象可以像函数一样被调用 |
静态成员函数 | 定义在class类中的静态成员函数 |
这里以实现a+b的函数功能为例
1 构建一个函数实例化function
fuction<返回值(参数类型1,参数类型2)> 函数名称=[] (参数类型 参数名,参数类型 参数名)->返回参数类型{ 函数体内容}
int main(){
function<int(int, int)> func1 = [](int a, int b)->int {
cout << "直接构建function" << endl;
return a + b; };
return 0;
}
2 通过普通函数实例化function
fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称
int sum(int a,int b){
return a+b;
}
int main(){
function<int(int,int)> func2=sum;
cout<<func2(20,20)<<endl;
return 0;
}
3 通过类中函数实例化function
fuction<返回值(类名称*,参数类型1,参数类型2)> 函数名称=&类名称::实例化函数名称
class mycode{
public:
int sum(int a,int b){ return a+b;}
}
int main(){
function<int(mycode*, int, int)> func3 = &mycode::sum;
mycode obj;
cout<<func3(&obj,100,200)<<endl;
return 0;
}
4 用lambda函数实例化function函数
fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称
auto sum = [](int a, int b)->int {
cout << "正在使用lambda中的sum" << endl;
return a + b; };
function<int(int, int)> func4 = sum;
cout << func4(100, 200) << endl;
5 用仿函数实例化function
fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称
struct mycode1 {
int operator()(int a, int b) {
cout << "正在使用仿函数实例化function" << endl;
return a + b;
}
};
int main(){
function<int(int, int)> func5 = mycode1();
cout << func5(100, 200) << endl;
return 0;
}
6 用静态成员函数实例化function
fuction<返回值(参数类型1,参数类型2)> 函数名称=实例化函数名称
class mycode2 {
public:
static int sum(int a, int b) {
cout << "正在使用类静态成员函数实例化function" << endl;
return a + b; }
};
int main(){
function<int(int, int)> func6 = mycode2::sum;
cout << func6(100, 200) << endl;
}
衍生
通过function进行函数对象实例化,使得封装后的对象可以像普通对象一样赋值,传递。
auto hanshu=func2;
cout<<hansu(20,30)<<endl;
void doshowallbooks() { cout << "查看所有书籍信息" << endl;}
void doborrow() { cout << "借书" << endl; }
void doback() { cout << "还书" << endl; }
int main() {
int choice = 0;
map<int, function<void()>> actionMap;
actionMap.insert({1,doshowallbooks });
actionMap.insert({ 2,doborrow });
actionMap.insert({ 3,doback });
auto iter1 = actionMap.find(1);
iter1->second();
auto iter2= actionMap.find(2);
iter2->second();
auto iter3 = actionMap.find(3);
iter3->second();
return 0;}