2013-07-09 123 views
1

我從std::codecvt派生出來創建自定義區域設置。我應該實施的大多數方法都非常簡單,除了這個std::mbstate_t。在我的編譯器vs2010中,它被聲明爲int。但是,谷歌告訴我這是一個POD類型,它有時是一個聯盟(我不知道的)或一個結構(我再也找不到它)。什麼是std :: mbstate_t?

據我所知,std::mbstate_t是部分轉換的佔位符。而且,我認爲,當std::codecvt::on_out()需要更多空間來編寫輸出時,它會發揮作用,而這又將調用std::codecvt::do_unshift()。如果我的假設錯誤,請糾正我。

我讀過another post關於存儲指針,雖然帖子沒有足夠的答案。我也讀this example它假定它是一個32位類型,雖然標準規定int不小於16位。

我的問題。我可以安全地存儲在std :: mbstate_t中什麼?我可以安全地將其替換爲另一種類型嗎?上述帖子的答案建議將其替換,但以下評論另有說明。

回答

2

我認爲關於這些東西的/書是由Langer和Kreft提供的C++ IOStreams和Locales,如果你真的想搞砸這些東西,試着弄個副本。現在,回到您的問題,mbstate_t用於保存轉換的狀態。通常情況下,您會將其存儲在轉換構面中,但由於構面是不可變的,因此您需要將其存儲在外部。在實踐中,當需要不止一個字節序列來確定相應的字符時,會使用這種方法,因此,Linux手冊頁mbsinit()給出了ISO-2022和UTF-7作爲此類編碼的示例。請注意,這不影響UTF-8,其中一個Unicode代碼點總是由一系列字節編碼,並且在影響結果之前或之後沒有任何內容。部分UTF-8序列也沒有被處理,do_in()代替partial

現在,您可以在mbstate_t中存儲什麼?由於實際類型是未定義的,並且操作它的函數數量非常有限,所以一開始您就無法使用它。但是,這個狀態也沒有任何其他的,所以你可以做一些醜陋的黑客攻擊。這可能需要幾個#ifdef,具體取決於標準庫,但是您可以簡單地(ab)使用它是POD(整數和聯合也是POD)的事實來存儲幾乎不大的任何類型的POD。這不會讓你獲得美觀的價格,代碼也不會自動在任何系統上運行,但我認爲在這種情況下它是不可避免的,移植工作也是有限的。

最後,你可以替換它嗎?這種類型是std::char_traits的一部分,反過來影響所有字符串和流,因此您需要在整個程序或轉換過程中替換它們。此外,如果您現在創建一個新的char_traits類,您仍然無法輕鬆實例化例如basic_string與它,因爲不能保證一般的basic_string模板甚至存在,只需要爲charwchar_t(和一些更多的C++ 11)的兩個專業化存在。同上流。總之,不,你不能取代mbstate_t。

相關問題