std::bind与占位符(placeholder)的用法与演化
解释std::bind和std::placeholders::_1等占位符的工作原理。bind如何实现参数绑定和重排?C++11的bind与C++14的lambda表达式相比,现在是否还应使用bind?
回答
小字辈
std::bind(func, arg1, arg2, ...)将可调用对象与部分参数绑定,生成一个新的可调用对象。占位符_1,_2,_3...表示延迟绑定的参数位置,std::placeholders::_N在第N个参数传入时对应替换。bind支持参数重排:bind(f, _2, _1)将第一个实参传给第二个形参,第二个实参传给第一个形参。底层:bind返回一个由实现定义的类,存储函数对象+绑定参数,调用时按占位符映射参数。建议:C++14的泛型lambda已可替代90%的bind场景,代码更直观,编译器更容易内联。bind保留的场景:①成员函数绑定(bind(&Class::method, &obj, _1));②函数重载消除(用lambda也需static_cast)。C++17后bind的占位符可配合std::apply。