2016-01-13 64 views
-3

我在C#中工作,我有一個任務,我會用C++使用模板類來解決。但是,我不能使用C#泛型,因爲傳入模板的類型不會從單個基類繼承或實現通用接口。C#中的按需編譯時代碼生成

現在我正在使用T4爲每種類型生成單獨的代碼,但是我希望這會在編譯時自動發生,這取決於我編寫的代碼,而不是在文本模板中手動維護列表文件。

在文本模板轉換工具包中是否有語法,實際上可以用模板在C++中的工作方式?

編輯:

比方說,我有這個TT文件:

<# string[] typeNameStrings = new string[2] {"Vector2d", "Vector3d"}; 
     foreach (string s in substitutions) 
     { #> 
      public class SumCalculator<#= s #> 
      { 
       public <#= s #> sum; 
       public SumCalculator<#= s #>(<#= s #> a, <#= s #> b) 
       { 
        sum = a + b; 
       } 
      } 
    <# } #> 

我不想保持陣列typeNameStrings,然後使用生成的類SumCalculatorVector2dSumCalculatorVector3d等相反,我希望儘可能接近C++模板功能(即SumCalculator<WhateverClass>)。我怎麼做?

+1

泛型不是模板。你遇到過這種情況。代碼將在這裏幫助。我的感覺是,你正在嘗試在C#中編寫C++,並且可能會根據你的工作方式做出更好的選擇。很難說沒有合理的定製細節。 –

+0

感謝您的建議。我已經添加了一個代碼示例。 –

+0

你已經說過這些類不共享一個通用接口,但你認爲他們有一個'+'運算符。這聽起來像是我的一個共同界面。在C#或C++中,我期望將這些東西存儲在一個容器中,並且在它們上面應用一個函數而不是您指定的方法。我的技術可能太有限,無法在這裏幫忙。祝你好運。 –

回答

1

如果我正確理解你,你在談論C++的鴨子打字機制,它依賴於模板的編譯時間擴展來找出爲每個單獨的模板類實例生成的實際代碼。

C#沒有這個功能,類代碼以其通用形式生成一次 - 這就是爲什麼要求其中使用的對象遵守普通對象規則(您的通用接口/類需求)。

但是,C#確實使用dynamic關鍵字進行了運行時鴨子打字。對於(小的)性能損失,以及(更重要的是)編譯時錯誤檢查的損失,您可以簡單地聲明對象dynamic並在其上調用函數和訪問字段,就如同使用C++模板一樣。