将类成员函数作为回调传递
当使用需要函数指针作为回调的 API 时,尝试传递时可能会出现困难来自类本身的类成员函数。本文探讨了这个问题的复杂性,并提供了有效解决该问题的解决方案。
问题陈述
考虑一个假设的类 CLoggersInfra,它包含一个成员函数 RedundancyManagerCallBack 。您试图在另一个 API 函数 Init 中使用此成员函数作为回调,但遇到以下编译错误:
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
深入研究问题
The错误源于 C 中成员函数的基本特征。虽然它们看起来只属于特定的类实例,但它们本质上会接收一个额外的隐藏参数,该参数是对类实例本身的引用。这通常称为“this”指针。
解决方案解释
1.使用Boost
Boost,一个第三方库,提供了一个强大的工具来解决这个问题:boost::bind。它允许您创建一个“锁定”特定参数的新函数。在这种情况下,隐藏的“this”参数可以锁定到特定的类实例,从而有效地创建一个只有一个可见参数的新函数。
2.使用自定义对象包装
或者,您可以创建一个自定义对象,该对象接受对类实例的引用,并提供一个“run”或“execute”方法,该方法使用提供的参数调用成员函数。但是,这种方法需要修改 API 以接受自定义对象而不是原始函数指针。
3. C 11 Lambda 函数
在 C 11 及更高版本中,lambda 函数提供了更优雅的解决方案。它们可以捕获“this”指针,从而无需单独的自定义对象。 Lambda 函数提供了一种简洁便捷的方法来实现所需的功能。
结论
理解成员函数的内在本质及其隐藏的“this”参数对于成功地将它们作为回调传递。通过利用 boost::bind 或 C 11 lambda 函数的功能,您可以有效解决编译错误并顺利地将类成员函数用作回调函数。
以上是如何将 C 类成员函数作为回调传递?的详细内容。更多信息请关注PHP中文网其他相关文章!