我正在开发一个包含监听消息的简单服务器的小项目。
假设我们有以下类:
class Message;
class Server
{
void handler1(Message msg);
void handler2(Message msg);
.
.
.
void handler19(Message msg);
};
我可以创建一个返回Server
的类void
的新函数类型,并获取一个名为msg的Message
变量,如下所示:
typedef void(Server::*MessageHandler)(Message msg);
所以类声明将是:
class Server
{
MessageHandler handler1;
.
.
.
MessageHandler handler19;
}
如上所述,使用sqlite3回调函数会很方便(函数声明不是最干净的函数)。
如果有可能,我该如何实现这样的功能?
如果无法做到这一点,是否有类似的方法使代码更简单(如C#代理)?
提前谢谢!
答案 0 :(得分:0)
代码:
class Server {
void handler1(Message msg); // This declares a method named handler one which takes a Message and returns void
void(Server::*handler)(Message); // This declares a member variable named handler of the type Server method pointer to a method that takes a Message and returns a void
};
handler
可以使用任何Server
方法重新分配,该方法需要Message
并返回void
。但它必须在首次使用之前进行初始化;例如:handler = handler1
此时调用handler
将调用handler1
。但是handler
可以随意重新分配,例如,如果您执行了此操作:handler = handler2
此时调用handler
将调用handler2
。
我不确定你的问题是否理解,但handler
从未定义过方法;只有指向一个的指针。
鉴于Server
的定义:
class Server {
void Handler1(int param) { cout << param + 1 << endl; }
void Handler2(int param) { cout << (param << 1) << endl; }
void Handler3(int param) { cout << (param != 0 ? "true\n" : "false\n"); }
void Handler4(int param) { cout << static_cast<char>(param + 'A') << endl; }
public:
function<void(Server, int)> handler_;
void next() {
if (!handler_ || *handler_.target<void (Server::*)(int)>() == &Server::Handler4) {
handler_ = &Server::Handler1;
} else if(*handler_.target<void (Server::*)(int)>() == &Server::Handler1) {
handler_ = &Server::Handler2;
} else if (*handler_.target<void (Server::*)(int)>() == &Server::Handler2) {
handler_ = &Server::Handler3;
} else {
handler_ = &Server::Handler4;
}
}
};
您可以执行以下操作:
Server foo;
for (auto i = 'A'; i <= 'Z'; ++i) {
foo.next();
foo.handler_(foo, i);
}