是否有理由不为functional的二进制函数提供一元版本?
我知道使用std::bind
创建一元版本很简单,但代码看起来很难看:
std::find_if(std::begin(v), std::end(v), std::bind(std::less_equal<int>(), std::placeholders::_1, 42));
我认为拥有类似的东西会更好:
std::find_if(std::begin(v), std::end(v), std::less_equal<int>(42));
答案 0 :(得分:6)
find_if(begin(v), end(v), [](auto x){ return x <= 42; });
答案 1 :(得分:4)
我认为没有技术原因可以禁止你的第二种方法。在弃用之前,std::bind2nd
辅助函数将非常接近您期望的方法:
std::find_if(std::begin(v), std::end(v), std::bind2nd(std::less_equal<int>(), 42));
当然,你总是可以自己做帮手 - 这很简短:
template <typename T> auto cmp_less_equal(const T& x) {
return std::bind(std::less_equal<T>(), std::placeholders::_1, x);
}
现在你可以写
了std::find_if(std::begin(v), std::end(v), cmp_less_equal(42));
使用您自己的包装器(demo)。
答案 2 :(得分:3)
你怎么给lambda一个名字?
const auto cmp_less_eq = [](auto x){ return x <= 42; };
const auto result = find_if(begin(v), end(v), cmp_less_eq);