2016-11-17 4 views
2

Вот код:О «связываются» в C++

vector<int> vec{ 0, 1, 2, 3, 4, 5, 6, 7 }; 
string str("123456"); 
auto result = find_if(vec.begin(), vec.end(), bind(check_size, str, _1)); 

Это не проходит vec к _1 вроде этого: (но код может работать корректно)

auto checkn = bind(check_size, str, _1); 
checkn(vec); 

Означает ли это, что _1 может автоматически принимать vec? Я совершенно смущен этим.

+2

'find_if' не передает' vector', а элементы 'vector' к нему. – songyuanyao

+0

Спасибо! Я сбивал с толку, что как bind знает, что такое _1. –

+0

'_1' является просто заполнителем, объявленным' bind'. Какой аргумент будет передан, определяется вызывающим, то есть 'find_if' здесь. – songyuanyao

ответ

1

Если у вас есть вызываемый объект, как, например, функции, вы можете сделать еще один вызываемый объект с std::bind() путем связывания некоторых его параметров на фиксированные значения и оставить другие параметры, которые будут представлены позднее. Последние идентифицируются с placeholders именем _1, _2, _3 и т.д.

В вашем примере, и предполагая, что check_size() функция принимает два аргумента, bind(check_size, str, _1) возвратит вызываемый объект, имеющий один параметр. Этот вызываемый будет возвращать для любого параметра x значение check_size("123456",x).

При использовании в вашем контексте find_ifbind(check_size, str, _1) будет поэтому вызываться для каждого элемента int в векторе до тех пор, пока результат не будет истинным.

Во втором случае вызываемый вызов будет вызываться с параметром vec. Это может быть или не компилироваться, в зависимости от того, как определено check_size().

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

  • Нет связанных вопросов^_^