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

时间:2016-06-15 14:13:18

标签: 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#代理)?

提前谢谢!

1 个答案:

答案 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);
}

Live Example