bind
2015-09-06 18:19
183 查看
// bind example #include <iostream> // std::cout #include <functional> // std::bind // a function: (also works with function object: std::divides<double> my_divide;) double my_divide (double x, double y) {return x/y;} struct MyPair { double a,b; double multiply() {return a*b;} }; int main () { using namespace std::placeholders; // adds visibility of _1, _2, _3,... // binding functions: auto fn_five = std::bind (my_divide,10,2); // returns 10/2 std::cout << fn_five() << '\n'; // 5 auto fn_half = std::bind (my_divide,_1,2); // returns x/2 std::cout << fn_half(10) << '\n'; // 5 auto fn_invert = std::bind (my_divide,_2,_1); // returns y/x std::cout << fn_invert(10,2) << '\n'; // 0.2 auto fn_rounding = std::bind<int> (my_divide,_1,_2); // returns int(x/y) std::cout << fn_rounding(10,3) << '\n'; // 3 MyPair ten_two ={10,2}; // binding members: auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply() std::cout << bound_member_fn(ten_two) << '\n'; // 20 auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a std::cout << bound_member_data() << '\n'; // 10 return 0; }bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指定的参数,可以使用占位符_1、_2、_3来表示。-1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。
bind可以绑定到普通函数、函数对象、类的成员函数和类的成员变量。
#include<iostream> #include<string> #include<functional>//std::bind using namespace std; class Base { public: Base(int x=0):data(x){} void show(string name){ cout<<name<<endl; } static int getNum(){return 10;} int operator()(int i,int j,int k){return i+j+k;} private: int data; }; int main() { using namespace std::placeholders; Base one(5); //1.绑定类成员函数 auto show1=bind(&Base::show,one/*调用者*/,_1); show1("123456");//123456 auto show2=bind(&Base::show,one,"123456"); show2();//123456 //2.绑定静态成员函数 auto getnum=bind(&Base::getNum); cout<<getnum()<<endl;//10 //3.绑定operator函数 auto oper=bind(&Base::operator(),one,_1,_2,0); cout<<oper(1,2)<<endl;//3 //相当于operator(1,2,0); return 0; }bind和lambda表达式一样,默认都是传值的,如果想要用引用,需要ref或cref函数,后者是常引用(例如const int&),也都位于functional头文件。
auto g = bind(f, ref(a), cref(b).....)
相关文章推荐
- 在web.xml中的welcome-file指定动态地址
- LA-11992-Fast Matrix Operations 快速矩阵操作(线段树成段更新)
- 数据结构与算法-字符串反转
- Java中的StringBuilder类功能详解
- transaction annotation不起作用的可能一
- Android必看面试题
- fastjson 使用方法
- android SDK manager 打开后获取不了版本列表
- 详解大端模式和小端模式
- [LeedCode OJ]#206 Reverse Linked List
- linux 系统优化tcp连接
- 基数树(radix tree)
- iOS 开发经典博客
- DataSet 采用合并之后处理重复行
- java.lang.IllegalArgumentException: the bind value at index 1 is null or java.lang.IllegalArgumen
- 怎样才是理想的程序员
- 手机iphone项-测试崩溃问题总结
- 编写shell脚本自动跳到某个目录
- IOS 实现边滑动边缩放的类似qq主界面的页面切换功能
- Nginx优化指南+LINUX内核优化+linux连接数优化+nginx连接数优化