C++11函数模板function,bind使用

本文介绍了C++标准库中的std::function和std::bind,std::function作为一个通用的多态函数封装器,可以存储、复制和调用各种可调用对象,提供类型安全。std::bind则是一个函数适配器,用于绑定可调用对象和其参数,生成新的可调用对象。通过示例展示了它们如何替代函数指针,以及在回调函数中的应用,强调了它们的灵活性和便利性。
摘要由CSDN通过智能技术生成

一、定义

  • std::function是函数模板类(是一个类);std::bind是函数模板(是一个函数);
  • 类模板 std::function 是通用多态函数封装器,最早来自boost库,对应其boost::function函数包装器。在c++0x11中,将boost::function纳入标准库中。
  • std::function 的实例能存储、复制及调用任何可调用 元素(Callable element) ,其中包括:函数、函数指针, lambda 表达式,成员函数或任意类型的函数对象。
  • 它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)

二、std::function,std::bind介绍

1. std::function

  • std::function可以取代函数指针的作用,因为它可以延迟函数的执行,特别适合作为回调函数使用。它比普通函数指针更加的灵活和便利。

包含在#include <functional>头文件中。

std::function声明:

std::function<ReturnType(paramType1,...,paramTypeN)>

不同类型可能具有相同的调用形式,如:

// 普通函数
int add(int a, int b){return a+b;} 

// lambda表达式
auto mod = [](int a, int b){ return a % b;}

// 函数对象类
struct div{
    int operator()(int a, int b){
        return a/b;
    }
};

可以用std::function将上述类型保存起来,如下:

std::function<int(int ,int)>  a = add; 
std::function<int(int ,int)>  b = sub ; 
std::function<int(int ,int)>  c = div(); 

2. std::bind

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

  • 将可调用对象和其参数绑定成一个防函数;
  • 只绑定部分参数,减少可调用对象传入的参数。

2.1bind普通函数

#include <iostream>
#include <functional>
using namespace std;
//乘法
double multip(double a, double b) { return a * b; }
int main()
{
	auto fn_2_times = bind(multip, placeholders::_1, 2);//2倍
	cout << fn_2_times(10) << endl;	//20
	return 0;
}

bind第一个参数是函数名,这里会隐式转成函数指针;

placeholders::_1是占位符,我理解应该是multip函数传参列表,表示第一个实参。2或者3是第二个实参。

2.2bind成员函数

class A{
public:
	int Add(int n1, int n2)
	{
		return n1 + n2;
	}
};

int main()
{
	A a;
	auto f = std::bind(&A::Add, &a, 100, std::placeholders::_1);
	cout << f(5) << endl; // 105
}

bind第一个参数成员函数地址,第二个参数对象地址,Add传参1,Add传参2

还可以bind一个引用参数,bind成员函数指针,比较难理解,用的场景也比较少,在这不做说明。

下篇说明使用std::function和std::bind作为回调函数使用的情况,二者配合使用,非常方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏克贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值