巧用宏定义来简写C,C++代码
Published on 一月 5, 2011
今天在工作上遇到一个问题,觉得很有代表性,特抽象如下:
通过设计模式的角度来说,就是模板方法,已经有一个基类,需要定义很多子类来实现其方法。
但是类名都只有一部分不同,且构造函数的入参也只有一部分不同。
如代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <iostream> #include <string> #include <vector> #include <set> #include <map> using namespace std; class EMA { public: EMA(string a,string b,string c,string d,string e) { cout <<a<<","<<b<<","<<c<<","<<d<<","<<e<<endl; } }; class EMA4CGI_1ST:public EMA{ public: EMA4CGI_1ST():EMA( "app_mng.1ST_EMA_AVG", "app_mng.1ST_EMA_HWM", "app_mng.1ST_EMA_TMO", "app_mng.1ST_EMA_N", "app_mng.1ST_EMA_RATIO" ){} ~EMA4CGI_1ST() {} }; class EMA4CGI_2ND:public EMA{ public: EMA4CGI_2ND():EMA( "app_mng.2ND_EMA_AVG", "app_mng.2ND_EMA_HWM", "app_mng.2ND_EMA_TMO", "app_mng.2ND_EMA_N", "app_mng.2ND_EMA_RATIO" ){} ~EMA4CGI_2ND() {} }; class EMA4CGI_3RD:public EMA{ public: EMA4CGI_3RD():EMA( "app_mng.3RD_EMA_AVG", "app_mng.3RD_EMA_HWM", "app_mng.3RD_EMA_TMO", "app_mng.3RD_EMA_N", "app_mng.3RD_EMA_RATIO" ){} ~EMA4CGI_3RD() {} }; int main(int argc, const char *argv[]) { EMA4CGI_1ST(); EMA4CGI_2ND(); EMA4CGI_3RD(); return 0; } |
输出如下:
app_mng.1ST_EMA_AVG,app_mng.1ST_EMA_HWM,app_mng.1ST_EMA_TMO,app_mng.1ST_EMA_N,app_mng.1ST_EMA_RATIO app_mng.2ND_EMA_AVG,app_mng.2ND_EMA_HWM,app_mng.2ND_EMA_TMO,app_mng.2ND_EMA_N,app_mng.2ND_EMA_RATIO app_mng.3RD_EMA_AVG,app_mng.3RD_EMA_HWM,app_mng.3RD_EMA_TMO,app_mng.3RD_EMA_N,app_mng.3RD_EMA_RATIO
非常恶心的代码,而且非常容易写错,如果是python,由于其本身自省的能力,所以不会存在这样的问题,但是C++可没有这种能力,所以我们只能寄希望与宏定义了。
直接来看一下我们改写的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | #include <iostream> #include <string> #include <vector> #include <set> #include <map> using namespace std; class EMA { public: EMA(string a,string b,string c,string d,string e) { cout <<a<<","<<b<<","<<c<<","<<d<<","<<e<<endl; } }; #define EMACLASS_DEFINITION(class_name)\ class EMA4CGI_##class_name:public EMA{\ public:\ EMA4CGI_##class_name():EMA(\ "app_mng."#class_name"_EMA_AVG",\ "app_mng."#class_name"_EMA_HWM",\ "app_mng."#class_name"_EMA_TMO",\ "app_mng."#class_name"_EMA_N",\ "app_mng."#class_name"_EMA_RATIO"\ ){}\ ~EMA4CGI_##class_name() {}\ }; EMACLASS_DEFINITION(1ST) EMACLASS_DEFINITION(2ND) EMACLASS_DEFINITION(3RD) int main(int argc, const char *argv[]) { EMA4CGI_1ST(); EMA4CGI_2ND(); EMA4CGI_3RD(); return 0; } |
输入结果为:
app_mng.1ST_EMA_AVG,app_mng.1ST_EMA_HWM,app_mng.1ST_EMA_TMO,app_mng.1ST_EMA_N,app_mng.1ST_EMA_RATIO app_mng.2ND_EMA_AVG,app_mng.2ND_EMA_HWM,app_mng.2ND_EMA_TMO,app_mng.2ND_EMA_N,app_mng.2ND_EMA_RATIO app_mng.3RD_EMA_AVG,app_mng.3RD_EMA_HWM,app_mng.3RD_EMA_TMO,app_mng.3RD_EMA_N,app_mng.3RD_EMA_RATIO
OK,问题解决!
可能问题本身在不同的场景下有多种解决方式,但是这至少提供了另一个看问题的角度,希望对大家有用。
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=1918
Vimer老大,是干C++这活的啊,我最近也开始学C++,不知道能不能跟你学习学习?
[回复]
Dante 回复:
一月 5th, 2011 at 10:58 下午
过奖啦,有什么问题可以和我随便探讨,呵呵~
[回复]
你好,你的博客的代码插件用的是哪个?我用的是google syntax插件,但是必须转到HTML模式下手工弄,很麻烦阿。而且还不能来回切换HTML和可视模式。。搜了很多也没有搜到好的解决方法。。
[回复]
梧桐 回复:
一月 6th, 2011 at 2:35 下午
帮博主回答啦。。wp-syntax。。
[回复]
我也想学C++,不过没有人带啊。
[回复]
要是Java的话我会选择把初始化代码写在static{}里头..C++ …我也没有想出来好办法.
[回复]
多谢博主分享,转载走了,谢谢!
[回复]