std::bind用来将可调用对象与其参数一起进行绑定,绑定后的结果可以用std::function(可调用对象包装器)进行保存,并延迟调用到任何我们需要的时候。
通俗来讲,它主要有两大作用:
(1)将可调用对象与其参数绑定成一个仿函数。
(2)将多元(参数个数为n,n>1)可调用对象转换成一元或者(n-1)元可调用对象,即只绑定部分参数。
注:std::placeholders为一个占位符,代表这个位置在函数调用时,将被第几个参数所替代。
void call_when_even(int x, const std::function<void(int)>& f)
{if (x % 2 == 0){f(x);}
}
void output(int x)
{cout << x << endl;
}
void output_add_2(int x)
{cout << x + 2 << endl;
}
//placeholders为占位符的意思,用于函数绑定的时候,缺省函数的占位符
int main()
{{auto fr = std::bind(output, std::placeholders::_1);for (int i = 1; i <= 10; ++i){call_when_even(i, fr);}}{auto fr1 = std::bind(output_add_2, std::placeholders::_1);for (int i = 1; i <= 10; ++i){call_when_even(i, fr1);}}return 0;
}
void output(int x, int y)
{cout << x << " " << y << endl;
}
int main(void)
{std::bind(output, 1, 2)();//输出1 2std::bind(output, std::placeholders::_1, 2)(1);//输出1 2std::bind(output, 2, std::placeholders::_1)(1);//输出2 1//std::bind(output, 1, std::placeholders::_2)(1); error,调用时没有第二个参数,缺少第二个参数std::bind(output, 2, std::placeholders::_2)(1, 2);//输出2 2,调用时第一个参数直接被吞并了std::bind(output, std::placeholders::_1, std::placeholders::_2)(10, 20);//10 20std::bind(output, std::placeholders::_2, std::placeholders::_1)(30, 40);//40 30return 0;
}
class Test
{
public:int value = 0;void output(int x, int y){cout << x << " " << y << endl;}
};
int main()
{Test test;/*std::function<void(int, int)> fr = std::bind(&Test::output,std::placeholders::_1, std::placeholders::_2);fr(1, 2);*/std::function<int& (void)> fr_i = std::bind(&Test::value, &test);fr_i() = 123;cout << test.value << endl;return 0;
}
struct Test
{
public:static const int Add(const int& x, const int& y){return x + y;}
};
int main()
{std::function<const int(const int&, const int&)> fr = std::bind(Test::Add, std::placeholders::_1, std::placeholders::_2);cout << fr(11, 44) << endl;return 0;
}struct Test
{
public:template<class T>const T Add(const T& x, const T& y){return x + y;}
};
int main()
{Test test;std::function<const int(const int&, const int&)> fr = std::bind(Test::Add<int>,test,std::placeholders::_1,std::placeholders::_2);cout << fr(10,20) << endl;return 0;
}