C++11可调用对象和bind绑定器
2016-04-06 23:16
399 查看
这是C++11增加的,不仅让我们使用标准库函数时变得更加方便,而且还能方便地实现延迟求值。
函数指针
具有operator()成员函数的类对象(仿函数)
可被转换为函数指针的类对象
类成员(函数)指针
以上涉及的对象可以像一个函数一样做调用操作,统称为可调用对象。现在,C++11通过提供std::function和std::bind统一了可调用对象的各种操作。
通俗来讲,它有两大作用:
将可调用对象与其参数一起绑定成一个仿函数。
将多元(参数个数>1)可调用对象转换成一元或者(n-1)元可调用对象,即绑定部分参数。
直接再上代码:
通过bind在函数外部通过绑定不同的函数,控制最终执行的结果。
1.1 可调用对象(Callable Objects)
可调用对象有如下几种:函数指针
具有operator()成员函数的类对象(仿函数)
可被转换为函数指针的类对象
类成员(函数)指针
以上涉及的对象可以像一个函数一样做调用操作,统称为可调用对象。现在,C++11通过提供std::function和std::bind统一了可调用对象的各种操作。
1.2 可调用对象包装器——std::function
function是一个类模板,可以容纳除了类成员函数指针之外的所有可调用对象。通过指定他的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行它们。#include <iostream> #include <functional> using namespace std; void output(int x) { cout << x << " "; } void call_when_even(int x, const function<void(int)>& f) { if(!(x&1)) { f(x); } } int main() { for(int i=0; i<10; i++){ call_when_even(i, output); } cout << endl; return 0; }
1.3 std::bind绑定器
bind用来将可调用对象与其参数一起进行绑定。绑定后的结果可以使用function进行保存,并延迟调用到任何我们需要的时候。通俗来讲,它有两大作用:
将可调用对象与其参数一起绑定成一个仿函数。
将多元(参数个数>1)可调用对象转换成一元或者(n-1)元可调用对象,即绑定部分参数。
直接再上代码:
#include <iostream> #include <functional> using namespace std; void call_when_even(int x, const function<void(int)>& f) { if(!(x&1)) { f(x); } } void output(int x) { cout << x << " "; } void output_add_2(int x) { cout << x+2 << " "; } int main() { { //auto fr保存bind返回结果,实际上bind返回类型是一个STL内部定义的仿函数指针, //可以直接赋值给function //placeholders::_1是一个占位符,代表这个位置在函数调用后,并第一个参数(参数0)所替代。 //参考C语言中的%d auto fr = bind(output, placeholders::_1); for(int i=0; i<10; i++){ call_when_even(i, fr); } cout << endl; } { auto fr = bind(output_add_2, placeholders::_1); for(int i=0; i<10; i++){ call_when_even(i, fr); } cout << endl; } return 0; }
通过bind在函数外部通过绑定不同的函数,控制最终执行的结果。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android Native 绘图方法
- 如何使用 bind 设置 DNS 服务器
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- Jquery绑定事件(bind和live的区别介绍)
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- jQuery bind事件使用详解
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结