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

在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 2
void MsgRegisterReply::echo()
static void MsgRegisterReply::echoStatic()
size 4 id 3
void MsgInviteReply::echo()
static void MsgInviteReply::echoStatic()
0
1
end
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值