2008-11-17 116 views

回答

5

它可以生成你想要的任何文本,包括C++代碼。

+0

是的。愚蠢的問題,我想。雖然我確實看到您可以指定模板語言是VB或C#。這大概與自動編譯模板的輸出有關? – mackenir 2008-11-27 11:06:58

+0

您的模板使用C#或VB生成,但我不認爲這與輸出有關。 – 2008-11-27 20:35:54

7

有點冗長的答案了,我認爲有些人可能會覺得很有意思

我會說T4是極好的生成C++與

也許有人會反駁說,C++已經有工具來做元編程與像:

預編譯

使用預處理和高階宏就可以實現somewha噸什麼,你可以用T4做,但我說有T4的一些非常有說服力的好處:

  1. 從T4生成的代碼是很容易調試和理解
  2. 元編程與T4比與預處理簡單。預處理器可以這樣做最大/最小宏很容易,但是當我們談論模型驅動的模板,它變得難以
  3. T4是更強大的比預處理器使它更容易開發模板
  4. T4可以作爲的一部分來執行建設過程中或按需

模板偏特

我不喜歡模板偏特招數,但我從沒有每個人都喜歡保持他們的經驗發言。

我一直努力減少代碼冗餘,努力提高可維護性。另外,如果可能的話,我更喜歡編譯時錯誤超過運行時錯誤。所以在閱讀Andrei Alexandrescu的Modern C++後,我想我找到了答案

我寫了一本受這本書影響很大的組件,然後我去度假了。當我回來時,團隊拋出了組件,並使用傳統技術重新編寫了自己的組件。它包含更多的代碼,比較笨拙,並且表現不佳,但是他們無法確定如何將功能添加到我編寫的組件,並確定它們必須這樣做。沒有什麼可以挽救。這些人也是聰明人。

他們錯了嗎?在可維護性方面,我會說他們做了正確的選擇,即使它讓我傷心。

我這個anechdote的一點是,T4有超過模板偏特招數一些好處:

  1. 從T4生成的代碼是很容易調試和理解
  2. T4是簡單
  3. T4更功能強大
  4. T4可以執行部分​​構建過程或點播
  5. 如果維護人員可以在T4模板中找到他們的頭部,他們仍然可以挽救代碼(start mai獲取生成的代碼並丟棄模板)。這在上面的陰莖疙瘩是不可能的。

當然,在C++中,MetaProgramming是預處理器和部分模板專業化的組合。

缺點

存在與當然T4缺點;

  1. 它是特定於Visual Studio(或特定於Mono)。但是,生成的代碼當然可以由GCC和其他人編譯。
  2. 這是非標準的
  3. Visual Studio C++ Projects似乎並不支持T4,它迫使我使用虛擬.NET項目來生成代碼frmo。

結束語

所有的一切我已經失去了興趣做先進的元編程C++使用與預處理或類型系統(我使用他們雖然較簡單的任務)花哨的技巧,並依賴於T4爲那些日子。

如果有人對如何在C++中使用它的示例感興趣,則可以檢出InteractiveGraphics。它是一個用於C#,VB,PowerShell和SmallBasic的庫,用於執行簡單的圖形處理。我使用T4爲.NET和C++之間的消息傳遞生成所有API和樣板代碼(如果我可以避免它,我不使用C++/CLI所有)來自描述API的模型。然後添加一個新方法就像擴展模型和重新生成所有temlate文件一樣簡單,然後我用C++實現一個抽象方法並且做有趣的事情。