C++模板的高级用法中Typelist的用法
2013-02-01 15:15
190 查看
在Modern C++ Design中提到了很多关于模板的用法,给我印象最深的是Typelist,其他的主要是看不懂,所以不知道有什么用,所以这里不谈。
但是对于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 */
相关文章推荐
- 关于模板偏特化,模板递归,及Loki之Typelist和一些感悟
- 模板之Typelist的"增删改查"
- dede模板标签:memberlist会员信息调用标签用法说明
- typename的高级用法
- wordpress自定义字高级用法为不同的文章载入不同的模板文件
- SharePoint列表的模板类型中的BaseType参数和ListTemplate参数
- CSS入门之列表样式用法及实例,list-style-image,list-style-type
- C++模板高级用法
- django中模板高级用法
- SharePoint列表的模板类型中的BaseType参数和ListTemplate参数
- 模板高级用法: Template Template Argument
- ul li -- list-style-type 样式用法
- [C++模板技术] TypeList(1)
- std::List的高级用法
- sp.net2.0中的新增控件BulletedList的一些高级用法
- 将任意类型映射到一个唯一整数(C++模板实现TypeList)
- 属性动画高级用法之TypeEvaluator和Interpolator
- 模板高级用法
- 03_模板、类型转换、新数组、Lamdbda表达式、New高级用法
- break 的一个“高级用法”