【C++】C++11的包装器:function与bind简介
分析: 如果n = 12345, k = 4, 要得到的是2 12345 的右起第4位 是2 1234 的右起第3位 是2 123 的右起第2位 是2 12 的右起第1位 是2 digit(n, k) --> digit(n / 10, k - 1) 截止条件,就是 k == 1的时候,结果就是n % 10。代码语言:javascriptAI代码解释。代码语言:javascript。代码语言:ja
一、function
1. 概念
上一篇文章我们学习了lambda表达式的用法。
std::function是 C++11 标准库在 <functional> 头文件中引入的一个通用、多态的函数包装器。它的本质是一个类模板,可以包装、存储、复制和调用任何可调用对象(函数指针、仿函数、lambda表达式、bind表达式等),存储的可调用对象被称为function的目标。function不含目标则为空,调用空function的目标会抛异常。 函数指针、仿函数、lambda表达式等可调用对象的类型各不相同,function可以统一类型,对他们进行包装,这样在很多地方就方便声明可调用对象的类型。
2. 用法

在这里插入图片描述
以上是function的原型,使用语法为:
代码语言:javascript
AI代码解释
#include <functional>
std::function<返回类型(参数类型1, 参数类型2, ...)> 包装器名称;
来看一段代码实例:
代码语言:javascript
AI代码解释
#include <iostream>
#include <functional>
using namespace std;
// 普通函数
int add(int a, int b)
{
return a + b;
}
// Lambda表达式
auto multiply = [](int a, int b) { return a * b; };
// 仿函数
struct Subtract
{
int operator()(int a, int b) const
{
return a - b;
}
};
int main()
{
// 声明一个function,他可以包装一个返回int,接受两个int参数的可调用对象
function<int(int, int)> func;
// 包装普通函数
func = add;
cout << "Add: " << func(10, 5) << endl; // 输出 15
// 包装 Lambda 表达式
func = multiply;
cout << "Multiply: " << func(10, 5) << endl; // 输出 50
// 包装仿函数对象
Subtract sub;
func = sub;
cout << "Subtract: " << func(10, 5) << endl; // 输出 5
// 甚至可以包装一个临时的Lambda
func = [](int a, int b) { return a / b; };
cout << "Divide: " << func(10, 5) <<std::endl; // 输出 2
return 0;
}
有一个特殊的点是,类的成员函数也可以被包装,但成员函数必须要指定类域并且前面加上&才能获取地址,静态成员函数可以不加&,但是为了方便记忆,建议成员函数都加上吧。这时还有一个问题,普通成员函数还有一个隐含的this指针,在类外包装时,也一定要显式写出this指针参数类型,即当前类的指针类型:
代码语言:javascript
AI代码解释
class Plus
{
public:
Plus(int n = 10)
:_n(n)
{}
static int plusi(int a, int b)
{
return a + b;
}
double plusd(double a, double b)
{
return (a + b) * _n;
}
private:
int _n;
};
int main()
{
function<int(int, int)> f = &Plus::plusi;
cout << f(1, 1) << endl; // 输出2
function<double(Plus*, double, double)> f1 = &Plus::plusd;
//调用时实例化出一个对象取地址传参即可,或者传对象也可以
Plus pd
cout << f1(&pd, 1.1, 1.1) << endl; // 输出22
/*function<double(Plus, double, double)> f1 = &Plus::plusd;
Plus pd
cout << f1(pd, 1.1, 1.1) << endl; */
return 0;
}
二、bind
1. 概念
std::bind是一个函数模板,也包含在<functional>中,是一个可调用对象的包装器,可以把他看做一个函数适配器,对接收的可调用对象处理后返回一个可调用对象。bind可以用来调整参数个数和参数顺序。
更多推荐


所有评论(0)