-
c++에서의 패킷 핸들러 바인딩프로그래밍/코드 조각 2018. 10. 21. 23:43반응형#include <cstdint>#include <map>#include <functional>using namespace std;namespace packet{enum class Type : unsigned short{None = 0,Login = 1,Logout = 2,};struct Header{std::uint16_t size;Type type;};struct Login{char id[20];std::uint8_t len;};}std::map<packet::Type, std::function<void(int, void*)>> handlers;template < typename PayloadType >void bind(packet::Type type, void(*handler)(int, const PayloadType&)){handlers[type] = [handler](int networkId, void* packet){const PayloadType& payload = *static_cast<PayloadType*>(packet);handler(networkId, payload);};}void handle_login(int networkId, const packet::Login& login){}int main(){bind(packet::Type::Login, handle_login);return 0;}
조금 응용하면 깔끔한 핸들러를 만들 수 있다.
프로토콜 버퍼를 쓰면서 해당 방식과 비슷하게 쓰는데 편하다. 여러가지 체크 코드를 끼워서 넣기도 하고.
++ 2019/08/01 클래스 멤버 함수 버전
#include <cstdint>#include <map>#include <functional>namespace packet{enum class Type : unsigned short{None = 0,Login = 1,Logout = 2,};struct Header{std::uint16_t size;Type type;};struct Login{char id[20];std::uint8_t len;};}class message_handler{public:message_handler(){bind(packet::Type::Login, &message_handler::handle_login);}template < typename PacketType >void bind(packet::Type packetType, void(message_handler::*handler)(const PacketType&)){handlers[packetType] = [this, handler](const void* ptr){const PacketType& packet = *((const PacketType*)ptr);((*this).*handler)(packet);};}void handle_login(const packet::Login& packet){}private:std::map<packet::Type, std::function<void(const void*)>> handlers;};int main(){message_handler handler;return 0;}반응형'프로그래밍 > 코드 조각' 카테고리의 다른 글
c++, istream으로 읽은 개수 반환 gcount (0) 2019.01.19 error_code 정의 참고 코드 조각 (0) 2018.10.28 표준 출력(cout, printf 등) 리디렉션 (0) 2018.07.06 엑셀 테이블에서 공백 컬럼 있는지 체크하는 코드 샘플 c# (0) 2018.06.16 c++ 문자열 스플릿 (0) 2018.05.10