c++回调到另一个成员函数



我有一个关于回调的问题。以前,我将我的回调与类Q 关联

class Q{
using Callback = std::function<void(char*, int)>;
Q:Q();
Q:~Q();
void Q::RegisterCB(Callback callbackfunc)
{
callback_func = callbackfunc;
}
void Q:someEvent()
{
callback_func();
}
};
void handleCallback( char*, int)
{
// perform some routine
}
// from my main file
int main()
{
Q q;
q.RegisterCB(&handleCallback);
}

它对我来说效果很好。但是,当我需要将handleCallback函数转移到另一个类以获得更干净的代码时。我有问题使用相同的代码

class R{
void R::handleCallback( char*, int)
{
// perform some routine
}
void R::someOp()
{
// q is some member variables of R
q.RegisterCB(&R::handleCallback, this);
}

};

然而,我遇到了一些问题,说有一个"对..的调用没有匹配的函数&";。我以为这只是简单地从函数名分配到类函数名

我能告诉你我哪里可能出错吗?

问候

&R::handleCallback的类型为void (R::*)(char*, int),不能转换为std::function<void(char*, int)>
此外,RegisterCB采用一个参数,而不是两个。

最简单的修复方法是将调用封装在lambda函数中

q.RegisterCB([this](char* p, int x) { handleCallback(p, x); }); 
关于如何使用lambda函数将R实例的成员函数注册为事件处理程序的示例。(出于习惯,我用string_view替换了char*,这对本例来说并不重要(。使用";const";无论你在哪里都是一个推荐。
#include <functional>
#include <string_view>
#include <iostream>
class Q
{
public:
// use const arguments, the callback is not supposed to change them
// just passing information on to callback
using callback_t = std::function<void(const std::string_view&, const int)>;

// initialize callback with a (lambda) function that does nothing
// this prevents the need for a check if callback has been set or not
// (Pattern : Null Strategy)
Q() :
m_callback_func( [](const std::string_view&,const int) {} ) 
{
}
~Q() = default;
void RegisterCallback(callback_t fn)
{
m_callback_func = fn;
}
void Event(const std::string_view& string, const int value)
{
m_callback_func(string,value);
}
private:
callback_t m_callback_func;
};
void handleCallback(const std::string_view& string, const int value)
{
std::cout << string << ", " << value << "n";
}
class R
{
public:
void handleCallback(const std::string_view& string, const int value)
{
std::cout << string << ", " << value << "n";
}
};
// from my main file
int main()
{
Q q1;
q1.RegisterCallback(handleCallback);
q1.Event("Hello", 42);
// to pass a callback to an instance of a class 
// you can use a lambda function https://en.cppreference.com/w/cpp/language/lambda
R r;
Q q2;
q2.RegisterCallback([&r](const std::string_view& string, const int value)
{
r.handleCallback(string,value);
});
q2.Event("World",21);
return 0;
}

最新更新