2016-06-15 2 views
1

메시지를 수신하는 간단한 서버가 포함 된 프로젝트를 진행 중입니다.클래스 내 함수 유형을 만들 수 있습니까?

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

:

class Message; 

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

내가 void를 반환하고 다음과 같이 MSG라는 단일 Message 변수를 얻는 클래스 Server의 새로운 기능 유형을 만들 수 있습니다

우리는 다음과 같은 수업을 가정 따라서 클래스 선언은 다음과 같습니다.

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은 메소드를 정의하지 않습니다. 하나에 대한 포인터 만.

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

관련 문제