用于常见操作的标准一元函数

时间:2016-08-24 15:15:05

标签: c++

是否有理由不为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));

3 个答案:

答案 0 :(得分:6)

自从C ++ 11/14以来,恕我直言,lambdas使这种谓词变得多余了吗?

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);