C++: назначение функции объекту tr1::function

Один из наших классов предоставляет объект обратного вызова tr1::function. Когда я пытаюсь назначить ему функцию-член, я получаю ошибку компилятора.

Приведенные ниже примеры не проверены и просто иллюстрируют:

foo.h:

class Foo()
{
public:
  Foo();
  std::tr1::function<void (int x)> F;
}

bar.h:

class Bar()
{
public:
   Bar();
   Foo* foo;
   void HookUpToFoo();
   void Respond(int x);
}

Bar.cpp:

Bar()
{
    this->foo = new Foo();
    this->HookUpToFoo();
}

void Bar::HookUpToFoo()
{
  this->foo->F = &Bar::Respond; // error
}

void Bar::Respond(int x)
{
       // do stuff
}

Полученная нами ошибка компилятора относится к строке в xrefwrap и является ошибкой ошибки 1 C2296: ".*": Недопустимый, левый операнд имеет тип "int" C: \ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ xrefwrap 64

..Что я делаю неправильно при назначении делегата? Я хочу пойти по более современному маршруту и ​​использовать tr1::function вместо указателей на функции.

2 ответа

Решение

Функция-член принимает дополнительный скрытый параметр: this, Это делает его несовместимым с вашим function объект, который принимает только один параметр. Вы можете привязать функцию-член к определенному экземпляру, используя bind, который также доступен в tr1:

using namespace std::tr1::placeholders;

this->foo->F = std::tr1::bind(&Bar::Respond, this, _1);

Это гарантирует, что Bar::Respond будет вызываться с правильным значением, связанным с this, _1 является заполнителем для дополнительного параметра (x).

Bar::Respond является функцией-членом, а не функцией. Это не может быть вызвано без this, Это так же, как разница между void (Bar::*)(int) указатель на функцию-член и void (*)(int) указатель на функцию

Ты можешь использовать mem_fn создать function объект из функции-члена.

F = std::bind1st(std::tr1::mem_fn(&Bar::Respond), this);
Другие вопросы по тегам