克服将类成员函数作为回调传递时的编译错误
由于误解,在将类成员函数作为回调传递时遇到编译错误关于语法和成员中隐藏的“this”参数函数。
澄清成员函数
成员函数不是独立函数,而是带有附加隐藏“this”指针的函数。该指针引用该函数所属类的实例。当使用类实例语法(例如 object.memberFunction())调用成员函数时,编译器会自动确定“this”的值。
语法难题
您最初的方法失败了,因为您尝试将 &CLoggersInfra::RedundencyManagerCallBack 作为回调传递。该函数指针缺少必要的“this”指针。正确的语法是:
m_cRedundencyManager->Init(std::bind(&CLoggersInfra::RedundencyManagerCallBack, this));
揭开隐藏的“this”
您想要传递特定于 CLoggersInfra 类的特定实例的回调。为了解决隐藏的“this”指针,您需要显式绑定它。
std::bind1st 和 boost::bind 救援
使用 std::bind1st或 boost::bind 绑定“this”指针,创建一个新函数,该函数将实例作为隐藏参数,并照常使用回调的原始参数。这解决了编译问题。
隐藏的陷阱
Init 需要一个原始函数指针,而 boost::bind 不提供开箱即用的功能。不过,StackOverflow 提供了一种将 boost::functions 转换为原始指针的解决方案。
使用 Lambda 函数更新 C 11
在 C 11 及更高版本中,捕获的 lambda 函数为此,“this”可以替换 boost::bind。
以上是如何在 C 中正确传递类成员函数作为回调?的详细内容。更多信息请关注PHP中文网其他相关文章!