Функция для оценки N-арных предикатов (count_if) - PullRequest
0 голосов
/ 10 февраля 2012

Я создал функцию, которая с учетом списка некоторого типа T и предиката (указателя на указанную функцию) подсчитывает, сколько элементов в списке возвращает true.

Это работает с атомарными предикатами(isEven, isOdd, is_less_than_42), но что мне делать, если я хочу использовать его с N-арными предикатами?Есть ли способ передать необязательный список N-1 аргументов, необходимых N-арному предикату?

template<typename T, class Pred>
int evaluate(listofelements<T> &sm, Pred pred){
    typename listofelements<T>:: iterator begin, end;
    int count=0;
    begin=sm.begin();
    end=sm.end();
    while(begin!=end){
        if(pred(*(begin->data))) count++;
        begin++;
    }
    return count;
}

1 Ответ

1 голос
/ 10 февраля 2012

Вы можете использовать std::bind для преобразования N-арной функции в унарный объект функции.

using std::placeholders::_1;

evaluate(sm, std::bind(some_function, _1, other, arguments));

std::bind в C ++ 11, но в старых компиляторах вполне вероятно, что TR1включен, где вы можете использовать std::tr1::bind, и, наконец, еще есть Boost.Bind.

Или вы можете создать объект функции самостоятельно:

struct SomeFunctor
{
    SecondType arg2;
    ThirdType arg3;
    SomeFunctor(cosnt SecondType& arg2, const ThirdType& arg3)
      : arg2(arg2), arg3(arg3)
    {}

    ResultType operator()(const FirstType& arg1) const
    {
        return some_function(arg1, arg2, arg3);
    }
};

evaluate(sm, SomeFunctor(other, arguments));
//           ^ construct SomeFunctor with arg2=other, arg3=arguments
...