使用 std::bind
的一些问题:
std::bind
不能自动绑定调用参数,需要std::placeholders
来配合
void DoStuffAsync(std::function<void(Status)> cb);
class MyClass {
void Start() {
DoStuffAsync(std::bind(&MyClass::OnDone, this)); // this line not compiles
}
void OnDone(Status status);
};
// fix
DoStuffAsync(std::bind(&MyClass::OnDone, this, std::placeholders::_1));
DoStuffAsync([this](Status status) { OnDone(status); });
// use abseil::bind_front
absl::bind_front(&MyClass::OnDone, this)
- 误用
std::bind
有时候不会触发编译器错误检查
void DoStuffAsync(std::function<void(Status)> cb);
class MyClass {
void Start() {
DoStuffAsync(std::bind(&MyClass::OnDone, this));
}
void OnDone(); // No Status here, but no compiler time warnings
};
std::bind
不等价于std::function
和lambda
,不要用于不是自己设计的类型上
std::bind
的其它常见推荐用法:
- 忽略某些入参
std::bind(F, _2)
- 重复使用某些入参
std::bind(F, _1, _1)
- 控制入参以及固定参数相对位置
std::bind(F, _1, 42)
,std::bind(F, _2, _1)
- 函数组合
std::bind(F, std::bind(G))
- 使用
lambda
替代std::bind