将类成员函数作为回调传递
在某些情况下,开发人员可能会遇到将类成员函数作为回调传递给外部 API。由于 C 语法的复杂性以及指针在该语言中的重要作用,此任务可能特别令人烦恼。
遇到的一个常见错误消息是:
编译器建议使用 & ;CLoggersInfra::RedundancyManagerCallBack 源自以下事实:RedundancyManagerCallBack 函数属于 CLoggersInfra 类,而不属于任何类该类的特定实例。因此,它被视为静态成员函数。将静态成员函数作为回调参数传递需要使用取址运算符 &。
然而,这只是冰山一角。真正的挑战在于解决成员函数具有隐式 this 参数的事实,该参数指定它们所属类的实例。在提供的示例代码中,RedundancyManagerCallBack 函数需要在 CLoggersInfra 类的特定实例上执行。
有多种方法可以解决此问题:
1.创建包装对象:
一种选择是创建一个单独的对象,该对象封装指向所需类实例的指针并公开调用所需成员函数的方法。然后可以将此包装对象作为回调参数传递。
2.使用 std::bind1st 或 boost::bind:
这些库提供了创建函数对象或绑定的机制,将函数的第一个参数固定为特定值。在这种情况下,可以将 this 指针锁定到特定实例,从而有效地创建一个仅采用必要参数的新函数。
3.使用 Lambda 函数(C 11 及以上版本):
在 C 11 及更高版本中,可以使用 lambda 函数捕获 this 指针并创建满足要求的回调函数。这是一个简洁而优雅的解决方案,不需要额外的包装对象或外部库。
理解成员函数的含义和指针的作用对于有效解决这个问题至关重要。通过利用本文中描述的技术,开发人员可以自信地将类成员函数作为回调传递,并弥合自己的代码和外部 API 之间的差距。
以上是如何将 C 类成员函数作为回调传递给外部 API?的详细内容。更多信息请关注PHP中文网其他相关文章!