2013-07-18 54 views
0

有人可以解釋爲什麼這不起作用嗎?wchar_t的模板專精

template < typename T > struct tester { static const size_t value = 0; }; 
template <> struct tester<char> { static const size_t value = 1; }; 
template <> struct tester< unsigned short > { static const size_t value = 2; }; 

size_t nTest = tester<wchar_t>::value; 

在我的編譯器,wchar_t被typedef爲unsigned short。爲什麼在底層類型具有專業化時使用默認模板?

編輯:好的,所以我錯了它是類型定義。 Intellisense向我展示了其他東西。雖然我的跨平臺和代理問題仍然存在。

這引起了一個曲線球,因爲我想根據它的尺寸使用wchar_t

另一個相關的問題。我如何以跨平臺的方式與wchar_t一起工作?我知道它在窗口上是16位,而在其他地方它可以是32位。如果它被定義爲32位類型,是否意味着它沒有(如在編譯器中被強制)使用代理對?

會這樣的工作?

template < typename T, size_t N = sizeof(wchar_t) > struct remap; 
template <> struct remap< wchar_t, 2 > { typedef unsigned short type; }; 
template <> struct remap< wchar_t, 4 > { typedef unsigned long type; }; 
+1

也許你錯了,你的編譯器工作正常(所以'wchar_t'是一個獨立的類型,而不是typedef)?嘗試爲'wchar_t'添加一個專門化,看看它是否沒有被使用(它當然適用於我有用的編譯器)。 –

+0

你究竟在做什麼? – juanchopanza

+0

@JerryCoffin'wchar_t'的專門化已經被使用,但在給定的例子中,它沒有被使用。我也試過類型定義我自己的類型,他們都工作,但wchar_t不。我如何檢查它是否是獨立類型?並會影響跨平臺的使用? – Twifty

回答

2

C++標準指定wchar_t是一種獨特類型的,而不是一個typedef。在一些不合規的實現中,或者有一些實現定義的選項,它可能是一個typedef,但是你不能依賴這個或者依賴它被typedef到任何特定類型的可移植代碼中。

是的,你的remap專業會工作; remap<wchar_t>::type將在具有雙字節wchar_t的平臺上的四字節wchar_tunsigned short的平臺上爲unsigned long。當然wchar_t並不限於這兩種尺寸,並且一個兩字節的值並不意味着它的16位等。如果您想根據最大值wchar_t編寫便攜代碼,可以持有您可能會看的WCHAR_MAX或其中之一選項顯示在評論中,而不是sizeof(wchar_t)

如果它被定義爲32位類型,那麼這是否意味着它沒有(如在編譯器中強制)使用代理對?

該標準實際上並未指定wchar_t,這種方式對於人們通常希望使用的東西特別有用。 wchar_t的意圖是提供一種類型,其中當前語言環境中的任何字符將表示爲單個wchar_t值,以便更輕鬆地進行文本處理。因此,wchar_t 1)不需要在所有語言環境中使用相同的編碼,並且2)代理對實際上不被允許。

由於不支持任何包含需要代理對的字符的區域設置,因此Windows'使用UTF-16類型可以在該秒點左右。這意味着便攜式代碼不會在包括Windows在內的任何平臺上處理代理對。

但是,是的,與32位寬wchar_t UTF-32平臺是一種常見的wchar_t編碼許多地方,特別是如果你堅持使用UTF-8作爲char編碼的語言環境。

+0

Windows肯定會返回並在必要時接受代理對。它可能不會以任何一致的方式對它們進行標準化,但它可以「處理」它們。 – rubenvb

+0

@rubenvb如果您對「可移植代碼不會處理代理對」作出響應,這並不意味着代理不在Windows上使用。 – bames53

+0

除非我錯了,否則可以將代理對的字符串傳遞給WinAPI函數,如果您要求包含它們的文件名等內容,則可以獲取它們。你將如何處理Unix在整個API函數中使用UTF-8而無需在整個地方進行轉換? – rubenvb

0

您可以簡化模板下面,你不需要專門它:

template < typename T > struct tester { static const size_t value = sizeof(T)/8; }; 

在平臺上,其中sizeof(wchar_t)是2,UTF-16被使用,所以代理人申請。

sizeof(wchar_t)爲4的平臺上,使用了UTF-32,因此代理不適用。