typedef double (Foo::* MyFooFunc)( int );
MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
Результат boost::bind
не является указателем на член, поэтому func1
не может быть инициализирован как таковой во второй строке.Результат boost::bind
- неопределенный тип (который будет зависеть от параметров).Если вы используете C ++ 0x, самый простой способ назвать результат вызова bind
- это использовать auto
:
auto func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
Другой простой способ (не ограничиваясь C ++03) просто не называть результат, а использовать его на месте:
SomeOtherFunction(boost::bind(&Foo::f1, _1, _2, "some string"));
Или вы можете использовать стирание типа, чтобы сохранить результат boost::bind
в boost::function
, чтоВы, кажется, знакомы с.boost::function<double(Foo&, int)>
- это возможность, но не единственный выбор.
Теперь нам нужно найти подходящую подпись для SomeOtherFunction
: опять же, указатель на член не может быть инициализирован из результатаЗвоните на boost::bind
, поэтому void SomeOtherFunction(MyFooFunc func);
не будет работать.Вместо этого вы можете сделать функцию шаблоном:
template<typename Func>
void SomeOtherFunction( Func func )
{
Foo foo;
boost::function< double (int) > finalFunc =
boost::bind( func, foo, _1 );
}
Если шаблон не является предпочтительным, то вы должны использовать какое-либо удаление типа, например, снова boost::function
.
void SomeOtherFunction(boost::function<double(Foo&, int)> const& func);
(еще раз возможны другие типы boost::function
в зависимости от таких деталей, как передача ref-to-const, а не ref-to-non-const)