【轉載】巧用宏定義來簡寫C,C++代碼

來源:互聯網
上載者:User

在Vimer的程式世界 [ http://www.vimer.cn ]中看到這篇文章,對宏有了一個更深刻的瞭解,所以轉載過來以便以後學習。

 

============== 以下為轉載內容 ==============

今天在工作上遇到一個問題,覺得很有代表性,特抽象如下:
通過設計模式的角度來說,就是模板方法,已經有一個基類,需要定義很多子類來實現其方法。
但是類名都只有一部分不同,且建構函式的入參也只有一部分不同。
如代碼:
#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,問題解決!

可能問題本身在不同的情境下有多種解決方式,但是這至少提供了另一個看問題的角度,希望對大家有用。  


本文轉載自Vimer的程式世界 [ http://www.vimer.cn ] 

原文連結地址: http://www.vimer.cn/2011/01/%e5%b7%a7%e7%94%a8%e5%ae%8f%e5%ae%9a%e4%b9%89%e6%9d%a5%e7%ae%80%e5%86%99%e4%bb%a3%e7%a0%81.html 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.