2013-10-13 2 views
2

Я задаюсь вопросом, почему следующие дает мне сообщение об ошибке:Почему std :: bind1st не работает над свободными функциями?

bool is_divisible(int by, int n) 
{ 
    return (n % by) == 0; 
} 

int main() 
{ 
    vector<int> v {1, 2, 3, 4, 5}; 
    cout << count_if(v.begin(), v.end(), bind1st(is_divisible, 2)) << endl; 
} 

Однако, если я использую bind(is_divisible, 2, _1), это работает. Мне интересно, какая техническая разница между bind1st и bind, что заставляет последние работать в этом случае?

+5

Фраза вроде «дает мне ошибку» должна немедленно сопровождаться самой ошибкой. – Adam

+0

@Adam Компилятор выводит довольно много, но ошибки, похоже, сосредоточены вокруг 'error: 'bool (*) (int, int)' не является классом, структурой или типом union'. К сожалению, я недостаточно разбираюсь в bind1st, чтобы разобрать это. Довольно интересно, если я присваиваю is_divisible к 'std :: function ', а затем использует bind1st, тогда он работает. Мне интересно узнать, что происходит за кулисами, что позволяет bind1st работать в некоторых из этих случаев, а не в других. –

+0

Возможный дубликат [Как использовать bind1st и bind2nd?] (Http://stackoverflow.com/questions/1418756/how-to-use-bind1st-and-bind2nd) – nurettin

ответ

4

bind1st:

This function constructs an unary function object from the binary function object op by binding its first parameter to the fixed value x.

(курсив мой)

function object является объектом, который, как предполагается, будет использоваться в качестве функции (т.е. перегружает operator()). Таким образом, bind1st не должен работать со свободными функциями.

Он работает, если обернут std::function, потому что тогда станет функцией объект.

Поскольку вы просто изучаете это, используйте вместо этого bind. Нет смысла изучать устаревший интерфейс.

+4

Итак, в pre-C++ 11 решение состоит в использовании комбинации 'std :: bind1st' и' std :: ptr_fun', то есть передать первый аргумент как: 'std :: bind1st (std :: ptr_fun (is_divisible), 2)'. В C++ 11 просто используйте 'std :: bind', как это уже знает OP. – Nawaz

+1

@Nawaz приятно знать. – Adam

Смежные вопросы