C++新特性探究(十五):bind
相关博文:C++新特性探究(十四):function
相关博文:C++头文件<functional>和bind、placeholders占位符使用简单例子
相关博文:《Essential C++》笔记之设计一个泛型算法(二)
相关博文:C++Function Object Adapter之not1
相关博文:C++之再探参数绑定bind、bind1st、bind2nd、placeholders占位符
相关博文:C++新特性探究(十五):bind
bind语义
bind 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函数、静态函数、类静态函数甚至是类成员函数,参数包括普通参数和类成员。绑定后的结果,可以使用 std::function 进行保存,并延迟调用到我们需要的时候。
一. 绑定普通函数与参数及占位
bind绑定的顺序,也就是函数中形参的声明顺序。
placeholders::_x中的序列是实参的顺序。
例1:
运行结果:
附例1代码:
//小问学编程
#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;double myDivide(double x,double y)
{return x/y;
}int main()
{//零个参数 return 10/2auto fn_five=bind(myDivide,10,2);cout<<fn_five()<<endl;//一个参数 return x/2 auto不可省auto fn_half=bind(myDivide,placeholders::_1,2);cout<<fn_half(10)<<endl;//一个参数 return 2/xauto fn_half2=bind(myDivide,2,placeholders::_1);cout<<fn_half(10)<<endl;//两个参数 return int x/yauto fn_rounding=bind<int>(myDivide,_1,_2);cout<<fn_rounding(10,3)<<endl;//反转参数 return y/xauto fn_invert=bind(myDivide,_2,_1);cout<<fn_invert(10,2)<<endl;return 0;
}
二. 绑定对象与成员及占位
绑定对象及成员函数时,顺序是调用成员,对象,[参数]。成员,对象及参数不能有缺位,缺位可用 placeholders::_x 来占位。否则编译不过。
例2:
运行结果:
三. 函数重载情形
例3:
//小问学编程
#include<iostream>
#include<functional>
using namespace std;
using namespace std::placeholders;int add(int x,int y)
{cout<<"int add(int x,int y)"<<endl;return x+y;
}
double add(double x,double y)
{cout<<"double add(double x,double y)"<<endl;return x+y;
}class MyPair
{public:int add(int x,int y){cout<<"MyPair::int add(int x,int y)"<<endl;return x+y;}double add(double x,double y){cout<<"double add(double x,double y)"<<endl;return x+y;}
};int main()
{auto bindGlobalFunc=bind((int(*)(int,int))add,_1,_2);cout<<bindGlobalFunc(1,2)<<endl;auto bindGlobalFunc2=bind(static_cast<double(*)(double,double)>(add),_1,_2);cout<<bindGlobalFunc2(1,2)<<endl;MyPair mp;auto bindMemberFunc=bind(static_cast<double(MyPair::*)(double,double)>(&MyPair::add),mp,1,2);cout<<bindMemberFunc()<<endl;return 0;
}
运行结果:
四. bind小结
(1)bind 预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value的。
(2)对于不事先绑定的参数,需要传 std::placeholders 进去,从_1 开始,依次递增。placeholder 是 pass-by-reference 的。
(3)bind 的返回值是可调用实体,可以直接赋给 std::function 对象。
(4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前, 这些参数是可用的。
(5)类的 this 可以通过对象或者指针来绑定。
五. 多态之bind+function
function 本是不可以包装类成员函数,但是 bind 的可以实现类成员函数的绑定, 然后赋给 fucntion 对象,亦即实现了间接性的包装。
bind+function 可以实现接口统一的极大整合,这是多态吗?
例4:
附例4代码:
//小问学编程
#include <iostream>
#include <functional>
using namespace std;void foo()
{cout<<"void foo()"<<endl;
}
void func(int a)
{cout<<"void func(int a)"<<endl;
}
class Foo
{public:void method(){cout<<"Foo::void method()"<<endl;}void method2(string s){cout<<"Foo:void method2()"<<endl;}
};
class Bar
{public:void method3(int a,string s){cout<<"Bar:void method3()"<<endl;}
};
function<void(void)> f;int main()
{f = bind(foo);f();f= bind(func,1);f();Foo foo;f = bind(&Foo::method,&foo);f();f = bind(&Foo::method2,&foo,"china");f();Bar bar;f = bind(&Bar::method3,&bar,10,"china");f();return 0;
}
C++新特性探究(十五):bind相关推荐
- C++新特性探究(十四):function
相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C++>笔记之设计一个泛型算法(二) 相关 ...
- C++新特性探究(十六):move constructor移动构造
相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...
- C++新特性探究(十):Lambda
一. 匿名函数 简短函数,就地书写,调用.即Lambda存在的意义,常用于取代作回调用的简短函数指针与仿函数. 就地书写,因只有函数体,即无函数名,也称匿名函数. 格式 最小的 Lambda: ...
- Java 8新特性探究(五)重复注解(repeating annotations)
2019独角兽企业重金招聘Python工程师标准>>> 知识回顾 前面介绍了: lambda表达式和默认方法 (JEP 126) 批量数据操作(JEP 107) 类型注解(JEP 1 ...
- C++新特性探究(十八):智能指针
一.智能指针及RAII 问题: C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题. C++的解决办法:RAII ...
- C++新特性探究(十二):static_assert(提前判误)
相关博文:C++之异常处理探究 相关博文:assert.if else.try catch三者的区别 相关博文:C++之assert.NDEBUG探究 相关博文:static_assert和asser ...
- C++新特性探究(13.6):右值引用再探究
相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...
- C++新特性探究(13.5):右值引用
相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...
- C++新特性探究(十三):右值引用(r-value ref)探究
相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...
最新文章
- Packet for query is too large (1166 1024). You can change this value
- 天使投资家李镇樟:如何培养世界级企业家
- linux删除git账号密码忘记了,linux清除git账号密码
- linux truncate文件,linux系统编程:用truncate调整文件大小
- linux上的中国象棋游戏下载,中国象棋下载_中国象棋最新下载_玩一玩游戏
- SpringBoot 多环境配置
- netpref 使用_使用PrefView监测.NET程序性能(一):Event Trace for Windows
- ASP.NET MVC 2 正式发布
- python 基础知识复习巩固
- 网吧计费系统数据库修复/网吧收银系统数据库恢复
- 超简单的jquery 点击文本复制文本
- Java 使用OpenCV进行颜色识别
- 华为鸿蒙星星之火,星星之火 数码视讯支持华为鸿蒙发布会全球直播
- 新人学习java导论
- 【实践案例分享】美团配送A/B评估体系建设与实践
- Sparkling Logic SMARTS 实时决策分析模块介绍
- 怎么把做好的网页用deramweaver传上互联网 空间和域名怎么申请
- L1 操作系统的启动
- oracle餐厅网络点餐系统_点餐系统产品演示
- 013. 跟郑军老师再聊科幻
热门文章
- Fragment学习1--生命周期
- 计算机音乐创作是什么,2021计算机音乐创作的作曲方式探究论文
- 基于JAVA+SpringMVC+Mybatis+MYSQL的个人博客系统
- java请求报错(原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘)
- java getconstructors,java 反射 constructors的问题,真心需要解决
- 《小团团团队》第四次作业:项目需求调研与分析
- shell 脚本 简易for循环 脚本
- new image()
- 检测子字符串是否存在于字符串或者变量是否存在于数组中
- Session和Cookie的学习笔记2