c++中关于lambda表达式和bind函数的问题?

  1. 描述你的问题
    这是c++ primer 的一道习题,练习10.24,其中有一行代码

auto predicate = [&](int i){ return bind(check_size, str, i)(); };

这行lambda表达式中为什么要在bind()后面多增添一个括号?若不添括号则报错

  1. 贴上相关代码(不添括号的情况下)

    auto check_size(string const& str, size_t sz){

       return str.size() < sz;

    }

    auto find_first_greater(vector<int> const& v, string const& str){

       auto predicate = [&](int i){ return bind(check_size, str, i); };

    return find_if(v.cbegin(), v.cend(), predicate);

    }

  2. 贴上报错信息
    严重性 代码 说明 项目 文件 行

错误 C2451 “std::_Binder<std::_Unforced,bool (__cdecl &)(const std::string &,size_t),const std::string &,int &>”类型的条件表达式是非法的 ConsoleApplication5 c:\program files (x86)\microsoft visual studio 14.0\vc\include\algorithm 43

  1. 贴上相关截图
    图片描述

回答:

auto predicate = [&](int i){ return bind(check_size, str, i)(); };

因为 lambda 的大括号内的return语句需要返回的是一个boolbind(...)返回了一个 callable,bind(...)()则是调用了这个返回的 callable,从而返回了一个bool

个人认为,本来单独使用std::bind或 lambda 就够了,题主却用 lambda 把 std::bind打包了一次。使用std::bind或 lambda 的目的就是为了将一个需要多个参数的函数,包装成只有一个参数的函数,从而能够用在各种需要 unary predicate 的标准库的算法函数的参数中。

代码见这里。其中std::bind的使用如下述片段所示:

bool check_size(const std::string &s, std::string::size_type sz) {

return s.size() >= sz;

}

bool check_size_v2(const std::string &s, int sz) {

return sz >= 0 && !check_size(s, sz);

}

std::vector<int>::iterator

findLarger(std::vector<int> &vi, const std::string &s) {

auto it = std::find_if(vi.begin(), vi.end(),

std::bind(check_size_v2, s, std::placeholders::_1)); // <--- 看这里

return it;

}

具体来说,std::find_if的第三个参数需要一个 unary predicate。std::bind是一个 function adapter,它会返回一个 callable object,且这个 callable object 只需要一个参数(只有一个 placeholder,其余参数都已提供)。所以可以用在std::find_if的第三个参数的位置。

回答:

bind(check_size, str, i)

也是初学,有错请指正哈。
这个东西是个可调用对象,你想要返回一个 bool,却返回一个这个,用在 find_if 里肯定会报错。

bind(check_size, str, i)() 

这个相当于你调用了这个可调用对象,那么得到的就是 bool 值了。
另外我觉得是不是 auto 有点被滥用了?

回答:

auto check_size(string const& str, size_t sz){

return str.size() < sz;

}

auto find_first_greater(vector<int> const& v, string const& str){

//predicate要作为一个函数对象来使用

//bind了之后是一个类似函数对象的东西,要调用才会返回值

auto predicate = [&](int i){ return bind(check_size, str, i)();/*此处要返回 '值'*/ };

return find_if(v.cbegin(), v.cend(), predicate);

}

上面和下面是一个效果,还有就是auto不是说你不用写返回类型的,这样写可能要c++11之后的版本才能支持

auto check_size(string const& str, size_t sz) -> bool {

return str.size() < sz;

}

vector<int>::const_iterator find_first_greater(vector<int> const& v, string const& str) {

//predicate要作为一个函数对象来使用

//bind了之后是一个类似函数对象的东西,要调用才会返回值

auto predicate = [&](int i){ return check_size(str, i);/*此处要返回 '值'*/ };

return find_if(v.cbegin(), v.cend(), predicate);

}

以上是 c++中关于lambda表达式和bind函数的问题? 的全部内容, 来源链接: utcz.com/p/191577.html

回到顶部