C++中的function与bind

function和bind是C++编程中很实用的方法,但是每次写代码都忘了如何使用,这里稍微汇总一下啊,方便记忆。

C++中的function

  1. Function的介绍
    在 C++中,function对象是一个通用的函数封装器,可以存储返回值与参数列表相同的可调用对象,例如函数、函数指针、Lambda表达式及重载了函数调用运算符的类对象等等。这样可以通过调用function对象的方式,使不同类型的可调用对象共享同一种调用方式。它能够让我们以一种通用的方式处理函数或函数对象,而不必在编写代码时考虑它们的具体类型。
    function 函数的使用需要包含头文件 #include
#include<functional>
using namespace std;

int add(int a,int b)
{
	return a+b;
}
int main()
{
    //function是标准库的模板,需要指定存储对象的返回值和参数类型
	std::function<int(int,int)> func1=add;
	cout<<func1(1,2);
	std::function<int(int,int)> func2=[](int a,int b){return a+b;};
	cout<<func2(1,2);

    //上面的示例,是使用同一类型的fuction对象存储不同类型的可调用对象。
};	
  1. function的应用
    在实际编程过程中function是很常用的功能,使用function函数可以实现类似于回调函数、事件处理程序和函数指针数组等功能。例如,我们将回调函数的类型设置为function对象,那么使用者在设置回调函数时,只需要考虑其返回值、参数类型即可,不需要考虑可调用对象本身的类型。或者将不同类型的可调用对象存储在STL容器中,以便在需要时随时调用。
typedef function<void()> CallBack;
void V_Print(const CallBack & cb)
{
	cb();
}
//使用function,我们在编程时,不需要考虑将来使用时传入回调函数具体是函数,或者是Lambda对象等。

void test1()
{
	printf("------买票就用12306----\n");
}
int main()
{
	auto lambd=[](int val){printf("-----用12306很难买到票----\n");};
	V_Print(test1);
	V_Print(lambd);
};	

C++中的函数适配器Bind

函数适配器,它可以接受一个可调用对象,生成一个新的可调用对象。其作用是,调整可调用对象的参数列表,使其新的调用要求。

typedef function<void()> CallBack;
void V_Print(const CallBack & cb)
{
	cb();
}

void test3(const char * str,int t1)
{
	printf("------用%d买不到票,%s----\n",t1,str);
}
int main()
{
    //将一个void(const char *,int)通过参数绑定,调整为void()类型
	V_Print(bind(test3,"那就卸载",12306));
};	
//bind可以通过绑定参数,让原来的可调用对象去适应新的调用规则

std::bind 还可以用于将成员函数与对象绑定,有时候想要把成员函数当作回调函数传入时,但是成员函数需要通过this绑定对象。

#include<functional>
#include<iostream>
class Foo 
{ 
    public:  
    Foo(int num):num_(num){}  
    int add(int a, int b)
    {    
        return a + b + num_;  
    } 
    private:  
    int num_;
};
int main() 
{  
    Foo foo(2);  
    auto add_five = std::bind(&Foo::add, &foo, 5, std::placeholders::_1);  
    std::cout << add_five(3) << std::endl;  // 输出 10  
    return 0;
}

在这个例子中,add_five 将 Foo::add 绑定到 foo 对象上,并将 5 绑定到第一个参数 a 上,将 std::placeholders::1 绑定到第二个参数 b 上。在调用 add_five 时,&foo 将作为 this 指针传递给 Foo::add 函数。最后,add_five(3) 将返回 a + b + num 的值,即 5 + 3 + 2 = 10。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值