std::bind 以局部变量作为值
std::bind to local variable as a value
绑定到作为局部变量的值是一种好习惯吗:
bool func(const std::string& a, const std::string& b)
{
return a + "abc" == b;
}
…………
auto str = getRandomString();
auto it = std::find_if(
vec.begin(),
vec.end(),
std::bind(func, str, std::placeholders::_1));
As std::bind
return value 是一个函数对象,它为每个局部变量创建一个新的函数对象?我应该改用 lambda 表达式吗?
auto it = std::find_if(
vec.begin(),
vec.end(),
[str](const std::string& b){return str + "abc" == b;});
你应该几乎总是更喜欢使用 lambda 而不是 std::bind
。首先,它不会像 std::bind
那样存在潜在的歧义;例如:
void foo(int a, std::string b);
void foo(Object a, std::string b);
std::bind(foo, std::placeholders::_1, some_string); // Which function is this binding?
(是的,你可以解决这个问题,但它真的很难看,需要显式转换)。
其次,lambda 版本可能会更快:最终它归结为普通函数调用(可以内联)。 std::bind
通常使用另一层间接(基本上是内部函数指针)来阻碍内联。
最后,您可以明确告诉 lambda 应该如何存储其闭包变量(通过引用或通过值)。这也可以用 std::bind
来完成,但通常更难看,需要 std::cref
或 std::ref
包装器。
两者都创建了一个包含 str
.
副本的函数对象
lambda稍微好一点,因为函数是成员函数,可以直接调用。 bind
存储一个函数指针,它可能需要存储,并且可能必须间接调用,具体取决于优化器的性能。
绑定到作为局部变量的值是一种好习惯吗:
bool func(const std::string& a, const std::string& b)
{
return a + "abc" == b;
}
…………
auto str = getRandomString();
auto it = std::find_if(
vec.begin(),
vec.end(),
std::bind(func, str, std::placeholders::_1));
As std::bind
return value 是一个函数对象,它为每个局部变量创建一个新的函数对象?我应该改用 lambda 表达式吗?
auto it = std::find_if(
vec.begin(),
vec.end(),
[str](const std::string& b){return str + "abc" == b;});
你应该几乎总是更喜欢使用 lambda 而不是 std::bind
。首先,它不会像 std::bind
那样存在潜在的歧义;例如:
void foo(int a, std::string b);
void foo(Object a, std::string b);
std::bind(foo, std::placeholders::_1, some_string); // Which function is this binding?
(是的,你可以解决这个问题,但它真的很难看,需要显式转换)。
其次,lambda 版本可能会更快:最终它归结为普通函数调用(可以内联)。 std::bind
通常使用另一层间接(基本上是内部函数指针)来阻碍内联。
最后,您可以明确告诉 lambda 应该如何存储其闭包变量(通过引用或通过值)。这也可以用 std::bind
来完成,但通常更难看,需要 std::cref
或 std::ref
包装器。
两者都创建了一个包含 str
.
lambda稍微好一点,因为函数是成员函数,可以直接调用。 bind
存储一个函数指针,它可能需要存储,并且可能必须间接调用,具体取决于优化器的性能。