Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以创建类内函数类型吗?_C++_Function - Fatal编程技术网

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

C++ 我可以创建类内函数类型吗?,c++,function,C++,Function,我正在做一个小项目,其中包含一个简单的服务器,可以监听消息 假设我们有以下类别: class Message; class Server { void handler1(Message msg); void handler2(Message msg); . . . void handler19(Message msg); }; 我是否可以创建一个类Server的新函数类型,该函数类型返回void,并获取一个名为msg的Message变量,如下所

我正在做一个小项目,其中包含一个简单的服务器,可以监听消息

假设我们有以下类别:

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=handler1
此时,调用
handler
就是调用
handler1
。但是
handler
可以随意重新分配,例如,如果您这样做:
handler=handler2
此时对
handler
的调用将是对
handler2
的调用

从你的问题中我不确定你是否理解,但是
handler
从未定义过方法;只有一个指向一个的指针

给出了
服务器的定义:

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;
        }
    }
};
类服务器{
代码的void Handler1(int param){cout:

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
};
处理程序
可以通过任何
服务器
方法重新分配,该方法接受
消息
并返回
void
。但它必须在首次使用之前进行初始化;类似于:
handler=handler1
此时对
handler
的调用将是对
handler1
的调用。但是
处理程序,例如,如果您这样做:
handler=handler2
此时调用
handler
就是调用
handler2

从你的问题中我不确定你是否理解,但是
handler
从来没有定义过一个方法;只有指向一个方法的指针

给出了
服务器的定义:

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;
        }
    }
};
类服务器{

void Handler1(int-param){我不认为这是一个特别好的主意。如果您可以访问C++11,您可以尝试以下内容:我不认为这是一个特别好的主意。如果您可以访问C++11,您可以尝试以下内容: