c++ - 我可以创建类内函数类型吗?

标签 c++ function

我正在开发一个包含简单服务器的小项目,它可以监听消息。

假设我们有以下类:

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 并返回 voidServer 方法重新分配。但是在第一次使用之前必须先初始化;类似于: 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);
}

Live Example

关于c++ - 我可以创建类内函数类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37837972/

相关文章:

c - 使用局部变量的递归,仅从一个 "function-part"可见

c++ - move 构造函数 : how to handle container attribute?

c++ - 使用角度 vector 进行高效 3D 旋转

c++迭代一项-UB或定义的行为?

c++ - 如何在模板类型名上编译时条件?

c++ - CNG:何时使用 BCrypt* 与 NCrypt* 系列函数

c - 使用函数创建链接列表时出现问题

java - 我想知道方法背后的实际实现,例如 : To create a file in Java, 使用 createNewFile()

javascript - 在悬停时使用 jQuery .animate 显示新的 div

c++ - 返回多维数组 C++