知识回顾:
在C中我们要调用一个函数是需要用到函数指针
在C++中我们调用一个函数有两种方法。1.仿函数。2.lambda
多种方式在调用时,就会出现多种情况,为方便接收,C++11引出包装器的概念
std::function
类模板函数是一个通用的可调用对象的包装器,它用简单的、统一的方式处理可调用对象。使用包装器之前需要包含头文件:#include <functional>
。
格式:function<返回类型(参数列表)>
如果std::function对象未包装可调用对象,使用std::function对象将抛出std::bad_function_call异常。
三种调用
1.普通函数
//普通函数
void swap_func(int& r1, int& r2)
{int tmp = r1;r1 = r2;r2 = tmp;
}
2.仿函数
//仿函数
struct Swap
{void operator()(int& r1, int& r2){int tmp = r1;r1 = r2;r2 = tmp;}
};
3.lambda函数
//lambda函数auto swaplambda = [](int& r1, int& r2) {int tmp = r1;r1 = r2;r2 = tmp;};
包装器的使用
//利用包装器包装//包装基础函数--只传函数地址(函数名)function<void(int&, int&)> f1 = swap_func;f1(x, y);cout << x << " " << y << endl << endl;//包装仿函数--调用用A()function<void(int&, int&)> f2 = Swap();f2(x, y);cout << x << " " << y << endl << endl;//包装lambda函数--传lambda对象名function<void(int&, int&)> f3 = swaplambda;f3(x, y);cout << x << " " << y << endl << endl;
由function包装器定义知道,是一个function类,而使用类就需要创造一个类对象才能调用类里的东西,所以每个function包装器都需要创建一个类对象去接收对应需要包装的函数/对象
接收后function包装器定义的对象就是该包装器所包装的函数的函数名,可直接使用该对象去调用函数f3(x, y);
创造map去列出一系列对应可调用函数
//列表初始化map<string, function<void(int&, int&)>> cmdOP = {{"函数指针", swap_func},{"仿函数", Swap()},{"lambda", swaplambda},};//map含有键值对《a,b》,[a]调用后就访问的他对应的b对象cmdOP["函数指针"](x, y);cout << x << " " << y << endl << endl;cmdOP["仿函数"](x, y);cout << x << " " << y << endl << endl;cmdOP["lambda"](x, y);cout << x << " " << y << endl << endl;
全部代码
#include<iostream>
#include<map>
#include<algorithm>
#include<functional>
using namespace std;//普通函数
void swap_func(int& r1, int& r2)
{int tmp = r1;r1 = r2;r2 = tmp;
}//仿函数
struct Swap
{void operator()(int& r1, int& r2){int tmp = r1;r1 = r2;r2 = tmp;}
};int main()
{int x = 0, y = 1;//原数cout << x << " " << y << endl;//lambda函数auto swaplambda = [](int& r1, int& r2) {int tmp = r1;r1 = r2;r2 = tmp;};//利用包装器包装//包装基础函数--只传函数地址(函数名)function<void(int&, int&)> f1 = swap_func;f1(x, y);cout << x << " " << y << endl << endl;//包装仿函数--调用用A()function<void(int&, int&)> f2 = Swap();f2(x, y);cout << x << " " << y << endl << endl;//包装lambda函数--传lambda对象名function<void(int&, int&)> f3 = swaplambda;f3(x, y);cout << x << " " << y << endl << endl;//列表初始化map<string, function<void(int&, int&)>> cmdOP = {{"函数指针", swap_func},{"仿函数", Swap()},{"lambda", swaplambda},};//map含有键值对《a,b》,[a]调用后就访问的他对应的b对象cmdOP["函数指针"](x, y);cout << x << " " << y << endl << endl;cmdOP["仿函数"](x, y);cout << x << " " << y << endl << endl;cmdOP["lambda"](x, y);cout << x << " " << y << endl << endl;return 0;
}
类的成员函数和普通调用区别
详细见:bind