您的位置:首页 > 其它

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).....)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: