2013-07-24 45 views
0

C++標準庫中有一些標準的基類層面,其默認行爲依賴於經典的「C」語言環境(std::locale::classic())。如果您的程序需要特定於文化的功能,那麼切換到派生類構面(也稱爲byname構面)的行爲取決於構造中指定的區域設置時,可以合理地進行切換。何時應該使用派生類facet來代替基類facet?

例如,std::ctype提供經典的 「C」 字符分類:

§22.4.1.3.3

static const mask* classic_table() noexcept; 

返回:一個指針,指向大小table_size的陣列的初始元件,其代表「C」語言環境中的字符分類

這是否意味着的行爲在功能上與它所安裝的語言環境不同。例如,假設我有日語語言環境:

std::locale loc("ja_JP"); 

我想用一個對日語字符進行字符分類的方面。性格分類是什麼std::ctype是:

auto& f = std::use_facet<std::ctype<char>>(loc); 

威爾fctype方法基礎上,日語語言環境,還是經典的‘C’的一個分類字符?我的第一個猜測是基於上面標準報價的「C」語言環境,但實際上它是日語語言環境。我想知道爲什麼報價不符合這裏發生的事情。

這裏是我的問題:

  • 爲什麼標準說ctype執行「C」字符分類時CTYPE基礎上與它正在使用的語言環境實際分類?

  • 由於上述情況屬實,派生類的方面在哪裏?爲什麼我應該在基類已經使用我想要的語言環境時使用派生類facet?

回答

1

只有默認構造std::ctype<char>方面使用classic_table其分類。從系統提供的"ja_JP"獲得的方面不是這樣的例子。

當談到派生的方面時,人們通常會引用從std :: ctype等等派生而來的用戶定義的方面,而不是系統提供的byname方面。如果要重新定義某個字符類(例如,將逗號用作空白來解析逗號分隔的輸入流,或停止將空格和製表符視爲空格,以便逐行解析流),則可以使用派生的ctype構面線。

+0

你的默認構造是什麼意思?方面不能默認構造(至少我認爲)... – 0x499602D2

+0

@ 0x499602D2'新的std :: ctype '調用默認的構造函數 – Cubbi

+0

哦是的。謝謝 – 0x499602D2