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

时间:2015-02-05 13:27:50

标签: 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));

由于std::bind返回值是一个函数对象,它为每个局部变量创建一个新的函数对象?我应该使用lambda表达式吗?

auto it = std::find_if(
    vec.begin(), 
    vec.end(), 
    [str](const std::string& b){return str + "abc" == b;});

2 个答案:

答案 0 :(得分:4)

你几乎总是喜欢使用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::crefstd::ref包装。

答案 1 :(得分:0)

两者都创建一个包含str

副本的函数对象

lambda稍微好一点,因为函数是一个成员函数,可以直接调用。 bind存储一个函数指针,可能需要存储,并且可能必须间接调用,具体取决于优化器的好坏程度。