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);