boost :: bind как объект l-значения - PullRequest
0 голосов
/ 16 сентября 2011

Есть ли способ сделать что-то подобное (MS VS 2008)?

boost::bind mybinder = boost::bind(/*something is binded here*/);
mybinder(/*parameters here*/); // <--- first call
mybinder(/*another parameters here*/); // <--- one more call

Я пытался

int foo(int){return 0;}

boost::bind<int(*)(int)> a = boost::bind(f, _1);

но это не работает.

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011
int foo(int){return 0;}
boost::function<int(int)> a = boost::bind(f, _1);
2 голосов
/ 16 сентября 2011

Привязка возвращает неопределенный тип, поэтому вы не можете напрямую создать переменную этого типа. Однако существует шаблон типа boost::function, который может быть сконструирован для любой функции или типа функтора. Итак:

boost::function<int(int)> a = boost::bind(f, _1);

должен добиться цели. Плюс, если вы не привязываете какие-либо значения, только заполнители, вы можете вообще обойтись без bind, потому что function также может быть создан из указателей функций. Итак:

boost::function<int(int)> a = &f;

должно работать, пока f равно int f(int). Тип сделал это для C ++ 11 как std::function для использования с замыканиями C ++ 11 (и bind, что также было принято):

std::function<int(int)> a = [](int i)->int { return f(i, 42); }

обратите внимание, что для прямого вызова в C ++ 11 новое использование auto стало проще:

auto a = [](int i)->int { return f(i, 42); }

но если вы хотите передать его, std::function все еще пригодится.

...