我正在开发一个包含简单服务器的小项目,它可以监听消息。
假设我们有以下类:
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# 委托(delegate))?
提前致谢!
最佳答案
对于代码:
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
可以用任何接受 Message
并返回 void
的 Server
方法重新分配。但是在第一次使用之前必须先初始化;类似于: 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);
}
关于c++ - 我可以创建类内函数类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37837972/