您的位置:首页 > 其它

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

2013-02-01 15:15 190 查看
在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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: