代码改变世界

C++ 利用模板设计通用的消息体

2015-04-28 13:04  刘腾达的博客  阅读(373)  评论(0编辑  收藏  举报

服务器用 C++ 搞得,消息协议分两种,定长消息和变长消息。游戏的消息协议都不复杂:包头,玩家ID,玩家数据。

    // 消息头    
    struct Base {
        int size;
        int id;

        Base(int _id, int _size)
            : id(_id), size(_size)
            {}
    };

    // 常见的一个消息
    struct RoleMsg : public Base {
        enum { ID = 0x001 };

        int PlayerID;
        RoleProps prop;

        RoleMsg() 
            : Base(ID, sizeof(*this))
            , PlayerID(0)
            {}
    }

每定义一个新的普通消息,都需要写上七八行代码。这些消息的结构都是差不多的,我们可以利用 template 简化定义消息的过程。

    // 模板消息
    template <typename T, unsigned I>
    struct StructTPL : public Base {
        int CharID;
        T prop;

        StructTPL()
            : Base(I, sizeof(*this))
            {}
    };
    
    // 普通消息
    typedef StructTPL <RoleProps, 0x1> RoleMsg;
    typedef StructTPL <T2, 0x2> T2Msg;
    typedef StructTPL <T3, 0x3> T2Msg;

利用模板,一行就可以定义一个新消息,比原来简单很多。

同样道理,变长消息也可以利用模板定义,就不用详细说明了。