boost::bind к любому методу класса - как?
От: Sashaka Россия  
Дата: 21.08.13 13:18
Оценка:
Привет

Допустим есть некий класс с набором методов, имеющих одинаковый тип возвращаемого значения но разные типы и количество аргументов.
Хочется добавить к этому классу нему метод который бы мог выполнить любой из остальных методов и вернуть его результат.
Вот что у меня получилось:
struct Test
{
  bool foo1(bool p) 
  { return true; }
  bool foo2(int p1, int p2) 
  { return true; }
  bool foo3(double p1, double p2, double p3) 
  { return true; }
  
  typedef boost::function< bool ( Test * const ) > Action;
  bool perform( Action a )
  {
    return a(this);
  }
};

int main( int argc, char* argv[] )
{
  Test t;
  t.perform( boost::bind( &Test::foo1, _1, false ) );
  t.perform( boost::bind( &Test::foo2, _1, 1, 2 ) );
  t.perform( boost::bind( &Test::foo3, _1, 3, 4, 5 ) );
}

Вопрос заключается в том — как написать, чтобы не приходилось указывать placeholder для this при вызове метода perform?
Хочу чтобы вызовы писались проще, а this прицеплялся уже внутри метода perform:
  Test t;
  t.perform( boost::bind( &Test::foo1, false ) );
  t.perform( boost::bind( &Test::foo2, 1, 2 ) );
  t.perform( boost::bind( &Test::foo3, 3, 4, 5 ) );

Но при попытке написать хотя бы
boost::bind( &Test::foo1, false );
компилятор (VS2005) падает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.