std::bind
иногда называют «частичным применением». Есть ли причины, по которым, когда все параметры функции связаны, сама функция не применяется?
Например, следующий код ничего не печатает.
#include <functional>
#include <iostream>
using namespace std;
using namespace std::placeholders;
void f(int a,string b) {cout << a << b << endl;};
int main() {
bind(bind(f,1,_1),"Hi!");
return 0;
}
Есть ли способ написать вариант привязки, который может применять функцию, когда все параметры фиксированы?
--Обновлять--
Теперь я понимаю из ответов, что std::bind
не совсем частичное применение. Итак, во второй части вопроса, как я могу написать что-то вроде std::bind, но с частичным применением. Я знаю, что bind(bind(f,1,_1),"Hi!")()
вызовет окончательную 0-арную функцию и вернет значение результата (в примере напечатано 1Hi
). Можно ли сделать шаблонное программирование для вызова оператора вызова функции() в терминальном случае bind?
Другими словами, можно ли написать функцию bind1
:
template< class R, class F, class... Args >
bind1( F f, Args... args )
, так что когда std::is_placeholder<T>::value == 0
для каждого члена args
, bind1()
может, в дополнение к тому, что делает std::bind()
, вызывать оператор()?
bind
иногда возвращал объект функции, а иногда возвращал что-то еще, особенно если вы создаете функцию, которую можно вызвать для ее побочных эффектов. - person user2357112 supports Monica   schedule 21.01.2014bind
называетсяbind
, а неcurry
. Кроме того, вам следует еще раз прочитать документацию по адресуstd::bind
— вы неправильно его использовать. Вы хотитеbind(bind(f,1,_1),"Hi!")
. - person Casey   schedule 21.01.2014curry
, как вы его сформулировали), как в других языках. - person tinlyx   schedule 21.01.2014