std::bind函数接受一个可调用对象以及参数列表来生成一个新的可调用对象,从而达到更改参数顺序以及参数数量的目的。传递给std::bind函数的占位符参数和返回的可调用对象的参数一一对应。
void printValue(int value1,int value2,int value3)
{
cout << value1 << endl;
cout << value2 << endl;
cout << value3 << endl;
}
void testFunc(std::function<void(int, int)> printFunc, int value1, int value2)
{
printFunc(value1,value2);
}
int main()
{
auto newFunc1 = std::bind(printValue, placeholders::_1, placeholders::_2, 123);
testFunc(newFunc1,111,222);//111 222 123
auto newFunc2 = std::bind(printValue, placeholders::_1, 123, placeholders::_2);
testFunc(newFunc2, 111, 222);//111 123 222
system("pause");
}
默认情况下,bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中,如果希望以引用方式传递可以使用ref函数。
void writeValue(string& value)
{
value = "hello world!";
}
void testFunc(std::function<void()> writeFunc)
{
writeFunc();
}
int main()
{
string value="hi";
auto newFunc1 = std::bind(writeValue, value);
testFunc(newFunc1);
cout << value << endl;//hi
auto newFunc2 = std::bind(writeValue, ref(value));
testFunc(newFunc2);
cout << value << endl;//hello world!
system("pause");
}