C++模板的高级用法中Typelist的用法

来源:互联网 发布:java中di是什么意思 编辑:程序博客网 时间:2024/06/15 12:16

在Modern C++ Design中提到了很多关于模板的用法,给我印象最深的是Typelist,其他的主要是看不懂,所以不知道有什么用,所以这里不谈。

但是对于Typelist,书中讲述了如何实现,但却没有用法介绍,我这里给出一个例子:

#include <iostream>#include <assert.h>#include "typelist.h"using namespace std;struct MsgRegisterRequest{  int container_type;  int  codec_id;  MsgRegisterRequest() :    container_type(0),    codec_id(1)  {}};struct MsgRegisterReply{  bool result;  MsgRegisterReply() :    result(false)  {}  static void echoStatic() { cout << __PRETTY_FUNCTION__ << endl; };  void echo() { cout << __PRETTY_FUNCTION__ << endl; };};struct MsgInviteRequest{  int container_type;  int  codec_id;  MsgInviteRequest() :    container_type(0),    codec_id(1)  {}};struct MsgInviteReply{  bool result;  MsgInviteReply() :    result(false)  {}  static void echoStatic() { cout << __PRETTY_FUNCTION__ << endl; };  void echo() { cout << __PRETTY_FUNCTION__ << endl; };};typedef ly::MakeTypelist< MsgRegisterRequest,                           MsgInviteRequest>::Result MyRequestMessages;typedef ly::MakeTypelist< MsgRegisterReply,                           MsgInviteReply>::Result MyReplyMessages;typedef ly::Append<  MyRequestMessages,  MyReplyMessages  >::Result MyMessage;template<class TList>class MsgQueueServer{public:  explicit MsgQueueServer(const char* name) {}  virtual ~MsgQueueServer() {}  template<typename M>  int postReply(const M& msg)  {    const int id = ly::IndexOf<TList, M>::value;    const int num = ly::Length<TList>::value;    std::cout << "size " << num << " id " << id << endl;    assert(id >= 0);    typedef typename ly::TypeAt<MyMessage, id>::Result MsgType;    MsgType m;    m.echo();    M::echoStatic();    return 0;  }  template<typename M>  void printId(const M& msg)  {    const int id = ly::IndexOf<TList, M>::value;    std::cout << id << std::endl;    return;  }};typedef MsgQueueServer<MyMessage> MyMQServer;class MessageHandlerObject{public:  MessageHandlerObject(MyMQServer& mq):mq_(mq)  {}  void handleRequest(const MsgRegisterRequest& request)   {    MsgRegisterReply reply;    mq_.postReply(reply);  }  void handleRequest(const MsgInviteRequest& request)   {    MsgInviteReply reply;    mq_.postReply(reply);  }  template<typename M>  void printid(const M& msg)  {    mq_.printId(msg);  }private:  MyMQServer& mq_;};int main(){  MyMQServer mq("luoyu");  MessageHandlerObject msgHandler(mq);  MsgRegisterRequest regist;  msgHandler.handleRequest(regist);  MsgInviteRequest invite;  msgHandler.handleRequest(invite);   msgHandler.printid(regist);  msgHandler.printid(invite);  std::cout << "end" << std::endl;  return 0;}/**************** OUTPUT from Console *******************[luo.yu@ly template]$ ./test size 4 id 2void MsgRegisterReply::echo()static void MsgRegisterReply::echoStatic()size 4 id 3void MsgInviteReply::echo()static void MsgInviteReply::echoStatic()01end*/


原创粉丝点击