我可以创建课堂功能类型吗?

Can i create in-class function types?

本文关键字:类型 功能 创建 课堂 我可以      更新时间:2023-10-16

我正在从一个小型项目上工作,其中包含简单的服务器,该服务器会听到消息。

假设我们有以下类:

class Message;
class Server
{
    void handler1(Message msg);
    void handler2(Message msg);
    .
    .
    .
    void handler19(Message msg);
};

我可以创建返回void的类Server的新功能类型,并获得一个称为MSG的单个Message变量:

typedef void(Server::*MessageHandler)(Message msg);

,类声明为:

class Server
{
    MessageHandler handler1;
    .
    .
    .
    MessageHandler handler19;
}

所述的一件事将带有sqlite3回调函数(其中函数声明不是最清洁的)。

如果可能的话,如何实现此类功能?

如果不可能,是否有任何类似的方法使代码更简单(例如C#委托)?

预先感谢您!

代码:

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 ? "truen" : "falsen"); }
    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);
}

实时示例