C++11特性之std::bind和std::placeholders
参考:
C++11特性之std::bind和std::placeholders
C++ std::bind
std::bind特性用于把可调用对象保存起来,在需要的时候再调用。
例如:
#include <functional> //bind函数 placeholders命名空间
int Plus(int x, int y) {
return x + y;
}
int PlusOne(int x) {
auto func = std::bind(Plus, std::placeholders::_1, 1);
return func(x);
}
int main()
{
std::cout << PlusOne(9) << std::endl; //结果 10
return 0;
}
使用场景
根据bind函数的特征,有以下几个场景时可以使用bind:
当bind函数的参数列表绑定到一个值时,则调用返回的函数对象将始终使用该值作为参数。所以bind函数可以将一个函数的参数特例化,如上文的示例代码
当bind函数的参数列表是一个占位符时,调用返回的函数对象的参数顺序号由占位符指定,所以bind函数可以对调用函数对象的参数重新安排顺序,例如:
using namespace std;
void output(int a, int b, int c) {
cout << a << " " << b << " " << c;
}
int main()
{
auto func = bind(output, placeholders::_2, placeholders::_1, placeholders::_3);
func(1, 2, 3); //结果 2 1 3
return 0;
}
C++11的占位符std::placeholders
例如遇到代码:
std::bind(&HelloWorldCallback, std::placeholders::_2)
使用C++11的bind函数绑定一个回调函数,第二个输入参数 std::placeholders::_2
的含义?
C++11的新特性:占位符std::placeholders,其定义如下:
namespace placeholders {
extern /* unspecified */ _1;
extern /* unspecified */ _2;
extern /* unspecified */ _3;
// ...
}
其中_1, _2, _3是未指定的数字对象,用于function的bind中。 _1用于代替回调函数中的第一个参数, _2用于代替回调函数中的第二个参数,以此类推。
---------未完待续 2022.11.11