2014-09-10 46 views
0

我正嘗試在遞歸宏/預處理器指令的幫助下生成一個類。我無法使用模板,因爲我正在構建類型(一個類)。宏用戶必須能夠創建此類而不重複變量。我不想爲變量使用容器,因爲它們可以具有有意義的名稱。帶有預處理器指令的C++類世代

class IInterface; 

class XYZ 
{ 
     int Mark1, Mark2, Mark3 /* variables to be passed */; 
     int count; 
     XYZ(IInterface * I) 
     { 
      count = 0; 
      // initialization values to be passed 
      Mark1 = 10; count++; I -> add(Mark1); 
      Mark2 = 20; count++; I -> add(Mark2); 
      Mark3 = 30; count++; I -> add(Mark3); 

     } 
}; 

我想放置位置,然後展開它們。

#define CLASS(_name) class _name {\ 
    int VARS; \ 
     int count; \ 
     _name(IInterface * I) \ 
     { \ 
      count = 0; \ 
      VAR = val; count++; I -> add(VAR); \ 
     } \ 
}; 

#define INIT // expansion code 

CLASS(XYZ) 
INIT(Mark1, 10) // variables should be sent only once for all the placeholders 
INIT(Mark2, 20) 
INIT(Mark3, 30) 

如何擴展INIT來替換佔位符? 我想知道這是否可行/建議。

+0

爲什麼你會這樣做,而不是使用繼承? – TartanLlama 2014-09-10 09:54:09

+0

爲什麼不使用'std :: vector'或'std :: array'或'std :: map'? – Jarod42 2014-09-10 09:56:21

+4

聽起來就像你試圖使用預處理器來定義你自己的編程語言的語法。您是否考慮過使用腳本語言(例如python或perl)爲您生成源文件,作爲make過程的預編譯步驟的一部分? – 2014-09-10 09:58:13

回答

2

這不是直接問題的「答案」,而是實現相同的目標。

宏一般是「邪惡的」,但有時可能有用。然而,在這裏,他們仍然是邪惡的,因爲任何稍後使用這個類的人都很難制定出它的實際定義,並且錯誤將更難以破譯。

因此,建議使用腳本語言作爲預構建步驟,可以讀取類的配置並從中生成C++文件。

然後,這些類的用戶將看到看起來易於理解的實際C++頭文件。

Perl或Python可能被用作此目的的腳本語言。我可能會選擇Perl。 然後,您可以將其作爲預構建步驟。

生成的頭文件將成爲目標文件,腳本定義以您決定的格式輸入,並且make腳本會因此知道目標是否是最新的。

對於輸入(類定義)文件,可以使用XML或JSON格式,這兩種格式都爲您提供了具有重複組的嵌套鍵值對。無論選擇哪種方式的優點在於

  • 他們是衆所周知的格式,開發人員瞭解誰需要讀或寫他們
  • 已經有代碼來解析他們,所以你不需要寫一個實際解析器,而只是使用解析的數據來生成輸出文件。