2012-05-17 35 views
6

我在互聯網上找不到任何有關這方面的信息,所以我正在尋找能夠洞察C++/CX方式的人。 C++/CX上的Wikipedia article表示它支持基於運行時的泛型,這意味着,爲了實例化泛型,您不需要全部實現的頭文件。我承認,這是如何工作的.NET(程序集包含IL代碼和JIT可以插入具體類型到它並編譯它,只要有一個新的實例),但在C++/CX(這是本機編譯)沒有JIT編輯代碼在運行時(我asume將非常困難的x86機器代碼)泛型如何在C++/CX中工作

所以這裏有什麼竅門,它是類型擦除拳擊或一些新的設計方案?

+5

像Java的「讓我們把所有東西都投入對象,然後再回來」的方法泛型。 –

+0

基於運行時的通用會。 C++的泛型擦除是boost :: any,但是如果你不需要,而且大多數人不需要,你不應該使用運行時泛型。改用模板。 –

+2

我認爲這是編譯時的事情。遇到啓動時,如「MyTemplate obj;」,編譯器將使用「MyTemplate」和「RealType」生成具體類定義的副本,然後使用它創建該對象。編譯後沒有模板事物。 – Lyn

回答

3

看着這篇文章在這裏引用泛型的最後一行(我知道關於類型的元數據存儲在.NET格式,我的方法的代碼後我)指定泛型在C++/CX中用於接口和委託。

http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx

這使得因爲,由於它被定義爲,允許C++/CX編譯器編譯的本機代碼的功能的實際對象,然後以類似於C++模板的方式使用的通用接口的接口感。編譯函數的本地代碼並使用通用接口來處理不同的類型。

對於編譯器來說,這似乎是C++/CLR和C++/CX之間的區別。 /clr:泛型類,接口&允許的代表。 /ZW:通用接口&僅代表。

如果你看這裏http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx你會注意到這些類沒有通用的規則。

但是,如果您閱讀了此主題http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx,您會注意到泛型被用作接口。

C++/CX中的「通用類」是通過使用標準C++模板實現的。實例化或編譯器生成的特定類型的泛型被導出到元數據中,但不是模板本身。因此,您可以從元數據中看到MyClass和MyClass,但不能看到原始的MyClass。對於作爲泛型導出到元數據的泛型接口案例,這不是真的。

可以在這裏找到 http://en.wikipedia.org/wiki/Windows_Runtime

所以完全回答這個問題,因爲這個時候,在方法的代碼是預編譯的本地代碼輸出DLL或EXE,並連接到實際的非對這個

更多信息泛型類。但是代碼可以通用地使用通用接口。因此十個不同的類可以實現IMyInterface,然後可以使用IMyInterface類型的變量來處理十種不同類型的實例。

因此,簡短的答案是沒有什麼像C++/CL中的C++/CX中的完整泛型類。在C++/CX應用程序中使用相同的效果模板。如果你必須有C++泛型,那麼使用用C++/CLI編寫的dll,並從編譯爲C++/CX的程序中運行該代碼。

注意!我從檢查各種文章中收集了很多內容,其中一些msdn似乎說他們可能會有所改變。

現在在模板中使用C++/CX中的通用接口可能是他們的意圖。因此,您創建了一個名爲MyClass的模板,然後它實現了名爲MyInterface的通用接口,因此,如果您然後創建了MyClass模板實例化,則新類型將自動實現MyInterface,然後可以在任何位置使用此接口。因此,在編譯後的dll和頭文件之外,其他C++/CX模塊和文件可以使用像MyInterface這樣的類型,而不需要頭文件,因爲模板實例化在編譯後的dll中,但是使用元數據的C++文件知道如何創建MyInterface類型是因爲它具有MyInterface的元數據,但不包含MyClass的元數據。

在很短的時間內,沒有泛型類,C++/CX中的通用接口和委託支持就像C++/CLI中泛型一樣工作。

+2

請記住,C++/CX與C++/CLI不同--Windows運行時與CLR不同,並且CLR中有功能不受winrt支持。您不能認爲CLR功能可以在C++/CX winrt應用程序中工作 –

3

據我所知,不支持任意C++/CX泛型。 C++/CX可以使用winrt參數化界面,這些界面顯示爲C++模板特化,但是不能導出任意泛型。

您可以從Windows :: Foundation命名空間創建參數化接口的特化,但不能創建原始參數化接口(公共參考模板)。

+0

是的,第二段是正確的。 –