知识回顾:
在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