惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
罗磊的独立博客
雷峰网
雷峰网
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
爱范儿
爱范儿
B
Blog RSS Feed
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
D
Docker
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Vercel News
Vercel News
小众软件
小众软件
人人都是产品经理
人人都是产品经理
云风的 BLOG
云风的 BLOG
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
I
InfoQ
S
SegmentFault 最新的问题

博客园 - 1901

试用Github Pages iOS设备内存及分辨率 测试显示GitHub的Gist 使用GTMBase64编码解码字符串 颜色转换工具 先随便记一下 iOS中获取程序相关的一些目录路径 mac字典词库增加方法 Google的Logo记现代舞先驱玛莎·葛兰姆117周年诞辰-Flash版 关于flash加载flash时的缩放和位置问题 给力壁纸 for mac Objective-C中的NSObject对象经常使用到的方法 Objective-C属性介绍 应用程序本地化-国家代码介绍(ISO 3166-1) iPhone开发资料 sourceMate2 我在MACOS下常用的软件 【转载】分享一些FLASH开发时用到的工具~ 关于ActionScript3中的事件类强制转换失败的问题
【转载】巧用宏定义来简写C,C++代码
1901 · 2011-03-16 · via 博客园 - 1901

今天在工作上遇到一个问题,觉得很有代表性,特抽象如下:
通过设计模式的角度来说,就是模板方法,已经有一个基类,需要定义很多子类来实现其方法。
但是类名都只有一部分不同,且构造函数的入参也只有一部分不同。
如代码:
#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++可没有这种能力,所以我们只能寄希望与宏定义了。
直接来看一下我们改写的代码:
#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,问题解决!

可能问题本身在不同的场景下有多种解决方式,但是这至少提供了另一个看问题的角度,希望对大家有用。