C++ std::作为值绑定到局部变量

C++ std::作为值绑定到局部变量,c++,lambda,bind,std,C++,Lambda,Bind,Std,绑定为局部变量的值是否是一种良好的做法: 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

绑定为局部变量的值是否是一种良好的做法:

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));
因为std::bind返回值是一个函数对象,所以它会为每个局部变量创建一个新的函数对象吗?我应该使用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版本可能更快:最终它归结为一个可以内联的普通函数调用。bind通常在内部使用另一层间接寻址函数指针,这基本上阻碍了内联


最后,您可以显式地告诉lambda它应该如何通过引用或值存储其闭包变量。这也可以通过std::bind实现,但通常更难看,需要std::cref或std::ref包装器。

您应该总是更喜欢使用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版本可能更快:最终它归结为一个可以内联的普通函数调用。bind通常在内部使用另一层间接寻址函数指针,这基本上阻碍了内联


最后,您可以显式地告诉lambda它应该如何通过引用或值存储其闭包变量。这也可以通过std::bind实现,但通常更丑陋,需要std::cref或std::ref包装器。

两者都创建一个包含str副本的函数对象


lambda稍微好一些,因为该函数是一个成员函数,可以直接调用。bind存储函数指针,该指针可能需要存储,并且可能必须间接调用,这取决于Optimizer的性能。

两者都创建一个包含str副本的函数对象



lambda稍微好一些,因为该函数是一个成员函数,可以直接调用。bind存储函数指针,该指针可能需要存储,并且可能必须间接调用,具体取决于Optimizer的性能。

在我的代码中编写的lambda函数应该在多个成员函数中调用。所以我应该把lambda的代码复制几次。这就是为什么我认为std::bind使用静态函数可能会更好。@Narek您可以创建一个变量来存储lambda吗?@JoachimPileborg考虑到变量捕获,我不知道该怎么做。找不到任何示例,请您帮忙好吗?@Narek auto my_lambda_func=[str]const std::string&b{return str+abc==b;}@Yuushi我应该存储为成员变量,而不是局部变量。在我的代码中编写的lambda函数应该在多个成员函数中调用。所以我应该把lambda的代码复制几次。这就是为什么我认为std::bind使用静态函数可能会更好。@Narek您可以创建一个变量来存储lambda吗?@JoachimPileborg考虑到变量捕获,我不知道该怎么做。找不到任何示例,请您帮忙好吗?@Narek auto my_lambda_func=[str]const std::string&b{return str+abc==b;}@YOUSHI应存储为成员变量,而不是局部变量。为不同的STR创建不同的函数对象?@Narek:为每个绑定调用或每个lambda表达式创建不同的函数对象。您的每个示例都创建一个函数对象,然后通过值传递它以查找_if,它会对每个向量元素调用一次。对于lambda,我想对于不同的str,使用相同的FO,那么std::bind呢?@Narek:我不知道您的意思。每个lambda表达式和每个对bind的调用都会创建一个新的函数对象。这就是我所要求的。为不同的str创建了不同的函数对象?@Narek:每个对bind的调用或每个lambda表达式都会创建一个不同的函数对象。您的每个示例都创建一个函数对象,然后通过值传递它以查找_if,它会对每个向量元素调用一次。对于lambda,我想对于不同的str,使用相同的FO,那么std::bind呢?@Narek:我不知道您的意思。每个lambda表达式和每个bind调用都会创建一个新的函数对象,这就是我要问的。