IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

巧用宏定义来简写C,C++代码

Vimer 2011-01-05 22:15:28 累计浏览 2,862 次
本机暂存

    今天在工作上遇到一个问题,觉得很有代表性,特抽象如下:

    通过设计模式的角度来说,就是模板方法,已经有一个基类,需要定义很多子类来实现其方法。

    但是类名都只有一部分不同,且构造函数的入参也只有一部分不同。

    如代码:

以下是代码片段:
#include  
#include  
#include  
#include  
#include  
using namespace std; 
class EMA 
{ 
    public: 
        EMA(string a,string b,string c,string d,string e) 
        { 
            cout <        } 
}; 
#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

    非常恶心的代码,而且非常容易写错,如果是python,由于其本身自省的能力,所以不会存在这样的问题,但是C++可没有这种能力,所以我们只能寄希望与宏定义了。

    直接来看一下我们改写的代码:

以下是代码片段:
#include  
#include  
#include  
#include  
#include  
using namespace std; 
class EMA 
{ 
    public: 
        EMA(string a,string b,string c,string d,string e) 
        { 
            cout <        } 
}; 
#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,问题解决!

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

同分类推荐文章

  1. 如何写好设计文档? (2026-06-23 08:00:00)
  2. Designing With Uncertainty: How AI Supercharges Probabilistic Thinking (2026-06-16 23:00:00)
  3. The Benefits Of Cognitive Inclusion In UX Research (2026-06-10 18:00:00)

查看更多 设计 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,457)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,419)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,262)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,508)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,450)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,877)
  7. 浅析C++多线程内存模型 (累计阅读 8,805)
  8. C++ 多线程编程总结 (累计阅读 8,100)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,210)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,583)