2016-06-15 12 views
1

私はメッセージを聞くシンプルなサーバーを含む小さなプロジェクトに取り組んでいます。クラス内の関数型を作成できますか?

class Message; 

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

iがvoidを返し、このような単一Message変数と呼ばれるMSGを取得するクラスServerの新しい関数型を作成することができます:

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

我々は以下のクラスを持っていると仮定すると

したがって、クラス宣言は次のようになります。

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

sqlite3コールバック関数(ここでは関数宣言が最もクリーンではない)を使うと便利でしょう。

可能であれば、どうすればこのような機能を実装できますか?

これができない場合は、C#代理人のようにコードをよりシンプルにする方法はありますか?

ありがとうございます!コードについて

+0

私は、これは特定の良いアイデアだとは思いません。 –

+0

C++ 11へのアクセス権があれば、次のようなことができます:http://stackoverflow.com/questions/12338695/c11-styled-callbacks – RyanP

答えて

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 
}; 

handlerMessageを取りvoidを返す任意Server方法で再割り当てすることができます。ただし、最初に使用する前に初期化する必要があります。 handler = handler1この時点でhandlerを呼び出すと、handler1が呼び出されます。しかしhandlerは自由に割り当てられます。たとえば、次のようにします。handler = handler2この時点でhandlerを呼び出すと、handler2が呼び出されます。

わかっていればあなたの質問からは分かりませんでしたが、handlerはメソッドを決して定義しません。 1へのポインタのみ。

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

関連する問題