указатель на класс функции boost bind - PullRequest
3 голосов
/ 05 августа 2011
class Foo 
{
    double f1( int x, std::string s1 );
    double f2( int x, SomeClass s2 );
}

Я хочу иметь возможность привязывать s1 Foo.f1 без экземпляра foo для создания в сути

typedef double (Foo::* MyFooFunc)( int ) 

MyFooFunc func1 = boost::bind( &Foo::f1, _1, _2, "some string" );
MyFooFunc func2 = boost::bind( &Foo::f2, _1, _2, SomeClass );

Затем я передаю func1 и func2 в качестве параметров другим функциям, внутри которых Fooнаконец-то связан:

void SomeOtherFunction( MyFooFunc func )
{
     Foo foo;
     boost::function< double (int) > finalFunc =
          boost::bind( func, foo, _1 );
}

Вопросы: возможно ли это?Если да, 1) как этого добиться?2) Что такое декларация MyFooFunc?

Ответы [ 2 ]

4 голосов
/ 05 августа 2011
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)

0 голосов
/ 05 августа 2011

Попробуйте это:

boost::bind(&Foo::f1, object, _1, _2);

object является экземпляром класса Foo. _1 и _2 являются заполнителями аргументов.

...