Как boost :: bind работает с std :: great и std :: less_equal - PullRequest
2 голосов
/ 03 января 2012

Следующий код предназначен для подсчета количества элементов, удовлетворяющих следующему условию:

(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.Конечно, моя мысль неверна.

Может кто-нибудь объяснить мне?Спасибо

1 Ответ

2 голосов
/ 03 января 2012

Заполнители _1, _2 и т. Д. Определяют параметры функтора, который возвращает конкретный (самый внутренний) вызов bind, а не полное выражение, которое вы, возможно, строите.Т.е. для:

boost::bind(std::greater<int>(),_1,5)

... bind возвращает функтор, который передает первый полученный параметр в качестве первого аргумента функтору greater<int>.

...