std::function的用法

介绍: std::function是一个可调用对象包装器,是一个类模板,可以容纳所有可调用对象,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟它们的执行。

头文件:#include <functional>

定义格式: std::function<函数类型>
因为std::function是一种模板,所以要传入类型将其当做std::vector<>这样的模板, 像std::vector<int>传入类型int一样,std::function传入的是函数类型<返回值 (参数类型)>,如:std::function<void (int)>

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

代码示例:
1、普通函数:

void func1(int val1,int val2)  
{     
	cout << "func1:" << val1 + val2 << endl; 
}
int main()  
{     
	function<void(int val1,int val2)> funcPtr = nullptr;   
	funcPtr = func1;  
	funcPtr(1,2);   
	getchar();   
	return 0;
}  

2、模板函数:

T g_Add(T i, T j) 
{    
	cout << i + j; 
	return i + j; 
} 
std::function<int(int,int)> f = nullptr; 
f = g_Add<int>; 
f(1,3); 

3、匿名函数:

auto func = [](int i, int j) -> int { // auto其实也是一个function指针     
	cout << i + j;   
	return i + j; 
};  
std::function<int(int,int)> f = func;
f(1,2);    

4、其他函数用法参考:c++ 知识点 std::function 使用

5、常见用法:
A类想调用B类的成员函数,不想让A类成为B类的友元(破坏封装),方法有:
1、直接返回B类成员函数的指针,赋值给function指针(需要将类对象地址 &c 绑定上),操作繁琐;
2、将B类成员函数包装进lambda表达式(匿名函数),匿名函数指针赋值给A类成员变量(function指针变量),调用A类成员变量完成B类函数调用 (回调函数,延迟函数执行)

  • 做回调函数时,必须拥有调用类的指针或者引用,若临时创建一个局部的实例,赋值给其函数指针变量离开作用域就没用了。但用作透传的类实例可以是局部的。回调函数一般在init函数中设置

3、两个领域(每个领域中都有多个类)间的类相互调用,通过做一个代理类agent_class,需要相互调用的类都保存该代理类的指针(可利用成员变量在调用类的init函数中赋值),在该类中做回调函数,用于交互。

参考资料:
1、C++11 中的std::function和std::bind 极好
2、std::function::function
3、c++ 知识点 std::function 使用

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值