首页 >后端开发 >C++ >如何将 C 类成员函数作为回调传递?

如何将 C 类成员函数作为回调传递?

Linda Hamilton
Linda Hamilton原创
2025-01-02 16:37:40610浏览

How Can I Pass a C   Class Member Function as a Callback?

将类成员函数作为回调传递

当使用需要函数指针作为回调的 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn