以下代码旨在计算满足以下条件的元素数量:
(i > 5) && (i <=10)
std::vector<int> ints;
..
int count=std::count_if(
ints.begin(),
ints.end(),
boost::bind( // # bind 1
std::logical_and<bool>(),
boost::bind(std::greater<int>(),_1,5), // # bind 2
boost::bind(std::less_equal<int>(),_1,10))); // # bind 3
template <class T> struct greater : binary_function <T,T,bool> {
bool operator() (const T& x, const T& y) const
{return x>y;}
};
我将上述声明分解如下:
boost::bind(std::greater<int>(),_1,5)
用于i > 5
boost::bind(std::less_equal<int>(),_1,10)
用于i <=10
。
我遇到的问题是如何理解上面的代码,因为如果我编写了代码,我将编写以下内容:
boost::bind(std::greater<int>(),_2,5)
用于i > 5
boost::bind(std::less_equal<int>(),_2,10)
用于i <=10
。
函数std::greater
需要两个参数(例如x
和y
),并确保x > y
。所以我认为我们需要将y
与5
绑定,以便我们可以找到所有Xs
。当然,我的想法是错误的。
有人可以帮我解释一下吗? 谢谢
答案 0 :(得分:2)
占位符_1
,_2
等指定了特定(最内部)bind
调用返回的仿函数的参数,而不是您可能正在构建的完整表达式。即为:
boost::bind(std::greater<int>(),_1,5)
... bind
返回一个仿函数,它将它接收的第一个参数作为第一个参数传递给greater<int>
仿函数。