2013-09-08 4 views
1

Существует множество примеров, касающихся использования заполнителей, однако я все еще немного смущен и был бы признателен, если бы кто-то мог объяснить разницу между двумя следующими утверждениямиРоль заполнителя в Boost :: bind в следующем примере

void SomeMethod(int a) 
{ 
    std::cout << "Parameter pass " << a << "\n"; 
} 

Statement 1 : boost::bind(&SomeMethod,_1)(12); 

Statement 2 : boost::bind(&SomeMethod,12)(); 

Я считаю, что я понимаю заявление 1, которое является цепью. Выходной сигнал boost::bind(&SomeMethod,_1) получает параметр 12, прикрепленный к нему. Однако мне трудно понять, что происходит в заявлении 2. Если параметр можно передать напрямую с помощью boost :: bind (как в инструкции 2), то зачем нужна заполнитель?

+1

Если вы хотите сразу же вызвать результат 'bind', вам не нужно« связывать »в первую очередь. Реальный прецедент - это вызов 'bind', теперь вызываем результат 300 функций и 5000 строк позже. –

ответ

4

Одним из применений заполнителей является изменение порядка аргументов конкретной функции

Пример взят из наддува. Предположим, что у вас есть f(x, y) и g(x,y,z). Тогда

bind(f, _2, _1)(x, y);     // f(y, x)  
bind(g, _1, 9, _1)(x);     // g(x, 9, x)  
bind(g, _3, _3, _3)(x, y, z);   // g(z, z, z)  
bind(g, _1, _1, _1)(x, y, z);   // g(x, x, x) 

Интересно отметить следующее BOOST руководство утверждение о последнем примере

Заметим, что в последнем примере, функция объекта производится Bind (г, _1, _1, _1) не содержит ссылок на какие-либо аргументы за пределами первого, но он все равно может использоваться с несколькими аргументами. Любые дополнительные аргументы молча игнорируются, так же как первый и второй аргументы игнорируются в третьем примере.

Я думаю, теперь ясно, что заполнители делают этот вид замены более чистым и элегантным.

В вашем конкретном случае использование 2 эквивалентно.

Можно выборочно связывать только некоторые из аргументов. bind (f, _1, 5) (x) эквивалентно f (x, 5); здесь _1 является аргументом-заполнителем, который означает «заменить первый входной аргумент».

Другое хорошее использование заполнителей - это когда у вас много аргументов, и вы хотите связать только один из них. Пример: представьте h(a,b,c,d,e,f,g), и вы просто хотите связать 6-й аргумент!

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