将成员函数作为参数传递
Passing member function as parameter
所以我有这个函数:
void EventDispatcher::Subscribe(string eventName, void (*callback)(void *))
{
....
}
我正在尝试将类成员函数作为回调参数传递给那里。
typedef void (*method)(void*);
void EventTester::RunTests()
{
_dispatcher = new EventDispatcher();
Event eventOne("one");
_dispatcher->Register("one", eventOne);
method p = &onOne;
_dispatcher->Subscribe("one", p);
}
void EventTester::onOne(void *args)
{
std::cout<<"Event onen";
}
显然这不能编译,因为 onOne 不是静态的,而是成员函数。有没有办法让它以这种方式工作?
您可以在 C++03 或 std::bind
中使用 boost,在 C++11 中使用 std::function
:
typedef boost::function<void(void*)> func_type;
void EventDispatcher::Subscribe(const string& eventName, const func_type& func_)
{
if ( ! func_.empty() ) {
// you could call the function
func_(NULL);
}
}
//Register looks like in a member function of EventTester:
...
_dispatcher->Subscribe("one",boost::bind(&EventTester::onOne,this,_1));
...
我放弃了假设您有能力修改Subscribe
签名的假设。如果没有,我的答案可能不适用。
正如您已经指出的,指向成员的指针(又名method
)与普通函数指针不同。若要使用指向成员的指针,必须提供类实例以在方法执行过程中调用函数。
您可以修改Subscribe
以显式接受指向成员的指针,这将需要一个额外的参数(class
实例)。您需要Subscribe
来存储函数指针和指向对象实例的指针。然后,这将要求将所有回调实现为指向成员的指针。
解决此问题的首选方法是使用 bind
(std::bind
或 boost::bind
)。
您需要更改Subscribe
函数以接收std/boost::function
对象而不是显式函数指针。这将允许 Subscribe 方法的调用方传入任何callable
对象(请参阅 std::function 文档中的示例)
然后,可以使用 bind
将类实例连接到方法指针。这将返回一个函子对象,该对象将同时保存指向成员的指针和指向类实例的指针。
有关如何使用绑定的示例,请参阅此链接
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 使用指向成员的指针将成员函数作为参数传递
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 修改函数中的指针(将另一个指针作为参数传递)
- 将成员函数指针作为参数传递给模板方法
- 如何在C++中将迭代器作为函数参数传递
- 将附加参数传递给使用 beast::bind_front_handler 调用的函数
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- 如何传递带有通过引用传递的结构参数的函数?
- 如何在 c++ 中将函数作为参数传递?
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 为什么我不能将引用作为 std::async 的函数参数传递
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将__device__ lambda 作为参数传递给 __global__ 函数
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 将函数作为参数传递以避免重复代码
- 如何在类(C )中作为参数传递函数