技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 编程语言 --> 巧用宏定义来简写C,C++代码

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

浏览:1888次  出处信息

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

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

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

    如代码:

以下是代码片段:
#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. C/C++宏定义的可变参数    (阅读:2360)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:二进制的二三事
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1