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

本文探讨了如何通过宏定义来简化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;
        }
};
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值