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 2
std::bind(output, std::placeholders::_1, 2)(1);//输出1 2
std::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 20
std::bind(output, std::placeholders::_2, std::placeholders::_1)(30, 40);//40 30
return 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;
}