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*/
- C++模板的高级用法中Typelist的用法
- C语言中宏的高级用法
- C语言中指针的高级用法
- django中模板高级用法
- [Pointer]C语言中指针的高级用法
- sscanf函数的高级用法 - [C/C++]
- C++中vector的用法
- C++中vector的用法
- c中 ## 的用法
- 模板之Typelist的"增删改查"
- C语言宏的高级用法
- (Linux,c++)函数的高级用法
- C语言宏的高级用法
- C语言宏的高级用法
- C语言 宏的高级用法
- C语言宏的高级用法
- c语言的模板 qsort 的用法
- mysql 中SUM 函数的高级用法
- 加多宝广告被禁用
- file的getPath getAbsolutePath和getCanonicalPath的不同
- Problem 12
- Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
- jdbc 连接数据库
- C++模板的高级用法中Typelist的用法
- C#专题之C#的表达式
- 虚拟三维及游戏引擎制作软件
- strus2 Action之间传值
- UNPIVOT 关键字将查询的字段一行显示
- mysql函数大全
- C#专题之成员查询与函数成员
- Linux内核模块函数调用及命名空间(1)
- VBA检查发送邮件附件