开发者社区> 问答> 正文

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

描述你的问题
这是c++ primer 的一道习题,练习10.24,其中有一行代码
auto predicate = &{ return bind(check_size, str, i)(); };
这行lambda表达式中为什么要在bind()后面多增添一个括号?若不添括号则报错

贴上相关代码(不添括号的情况下)
auto check_size(string const& str, size_t sz){
return str.size() < sz;
}
auto find_first_greater(vector const& v, string const& str){
auto predicate = &{ return bind(check_size, str, i); };
return find_if(v.cbegin(), v.cend(), predicate);
}
贴上报错信息
严重性 代码 说明 项目 文件 行
错误 C2451 “std::_Binder”类型的条件表达式是非法的 ConsoleApplication5 c:program files (x86)microsoft visual studio 14.0vcincludealgorithm 43

贴上相关截图
screenshot

展开
收起
a123456678 2016-03-09 15:26:59 2761 0
1 条回答
写回答
取消 提交回答
  • auto predicate = &{ return bind(check_size, str, i)(); };
    因为 lambda 的大括号内的return语句需要返回的是一个bool,bind(...)返回了一个 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的第三个参数的位置。

    2019-07-17 18:56:16
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载

相关实验场景

更多