将“执行期变量”转成“编译期常量”
来源:互联网 发布:奶粉 保鲜袋 知乎 编辑:程序博客网 时间:2024/06/14 16:32
/******************************************************************** file name : rc2bc.h author : Clark/陈泽丹 created : 2011-12-21 备注: 由于模板的模板参数只能是类型或“编译期常量”,导致面对执行期变量模板的使用很麻烦。 本例通过二分查找,将“执行期变量”转成“编译期常量”。 补充: 本例属于静态分派,当命令类型超过1000后,编译时间在本人机器上达到十几秒。 以后的改善方法:通过宏命令和ID编码,对每个类定义一个自身的生成函数。 本解法的作用实例: 1,可以在网络通讯中省掉一大堆if/else或switch的转换语句。 2,可以让不同模块的人在添加模块时各自只局限性于自身的领域,系统会通过偏特化机制自动把用户的模块添加进系统的功能里。 3,通过模板机制,让每个对象不用保持一致的基类,即每个做为接口的CMD类的功能和属性可以完全不同。避免了采用虚函数时,要保持一致的接口再到子类里去实现的等绕来绕过问题。*********************************************************************/ #include <iostream>#include "ServerType.h"using namespace std;//--------------------- 框架类(服务端文件) -----------------------------template<int v>class CMD{public:enum { value = v };void run(){ cout<<"未定义指令: "<<value<<endl; }};//将执行期的变量转成编译期的常量(以便作为模板参数使用)template<int s, int e>class rc2bc{public:static bool c2c(int i){if( i<s || i>=e) return false;const int POS = (s+e)/2;CMD<POS> cmd;if( cmd.value == i){ cmd.run(); return true; }else if( cmd.value > i){ return rc2bc<s,POS>::c2c(i); }else{ return rc2bc<POS,e>::c2c(i); }}};template<int v>class rc2bc<v, v>{public:static bool c2c(int i){ return false; }};//--------------------------------------------------//--------------------- 用户类1(客户端文件) -----------------------------const int USER_CMD_1 = 1;template<>class CMD<USER_CMD_1>{public:enum { value = USER_CMD_1 };void run(){ cout<<"这是上线命令: "<<value<<endl; }};//--------------------- 用户类2(客户端文件) -----------------------------const int USER_CMD_2 = 2;template<>class CMD<USER_CMD_2>{public:enum { value = USER_CMD_2 };void run(){ cout<<"这是掉线命令: "<<value<<endl; }};//执行void main(){for(int CMD_ID=-5; CMD_ID<5; CMD_ID++)rc2bc<1, 100>::c2c(CMD_ID);system("pause");}
- 将“执行期变量”转成“编译期常量”
- Java编译期常量
- 编译期常量
- java 编译期常量
- 编译期常量
- 编译期常量和非编译期常量
- integral_constant定义编译期常量
- integral_constant定义编译期常量
- java编译期常量 static final
- 编译期常量的一些事儿
- 程序在 编译期,链接期, 运行期各执行哪些操作?
- 程序在 编译期,链接期, 运行期各执行哪些操作?
- 编译期强制函数参数为字符串常量
- C++利用常量表达式在编译期操作字符串
- 编译期与运行期
- 编译期与运行期
- 字符串编译期与运行期分析及字符串常量池
- 类字面常量 .class 和 forname()方法的区别 编译期常量
- textarea标签中resize缩放属性的设置
- Win7系统中打开CHM文件最简单的方法
- 查看data
- 对服务器上出现大量的SYN_RECV状态的TCP连接的问题分析
- split() ,substring(),substr()字符串处理函数
- 将“执行期变量”转成“编译期常量”
- jsp中页面跳转request.sendRedirect和request.getRequestDispatcher
- Android ProgressDialog的两种用法
- 关于perl中的反引号(``),system和exec
- shell初级教程-备忘录2
- Why is RAID So Important for Databases?
- 【黑马程序员】02 Java基础之关键字(中)
- 优化Dalvik虚拟机的堆内存分配
- [Linux相关] adb"不是内部命令和sudo: adb: command not found