我推導了ctype
類來構建我自己的方面,以覆蓋它的虛函數do_is()
。我的目的是讓流提取器忽略空格字符(並且仍然在製表符上標記)。這個壓倒一切的要求實施母親班。但它只能用wchar_t
進行編譯。對於char
模板值,沒有執行ctype::do_is()
。這對於海灣合作委員會和VS 2010來說都是如此。方面ctype,do_is()和專精
這是我的代碼;你只需要取消註釋第五行來做兩個版本之間的測試。
#include <iostream>
#include <locale>
#include <sstream>
// #define WIDE_CHARACTERS
#ifdef WIDE_CHARACTERS
typedef wchar_t CharacterType;
std::basic_string<CharacterType> in = L"string1\tstring2 string3";
std::basic_ostream<CharacterType>& consoleOut = std::wcout;
#else
typedef char CharacterType;
std::basic_string<CharacterType> in = "string1\tstring2 string3";
std::basic_ostream<CharacterType>& consoleOut = std::cout;
#endif
struct csv_whitespace : std::ctype<CharacterType>
{
bool do_is(mask m, char_type c) const
{
if ((m & space) && c == ' ')
{
return false; // space will NOT be classified as whitespace
}
return ctype::do_is(m, c); // leave the rest to the parent class
}
};
int main()
{
std::basic_string<CharacterType> token;
consoleOut << "locale with modified ctype:\n";
std::basic_istringstream<CharacterType> s2(in);
s2.imbue(std::locale(s2.getloc(), new csv_whitespace()));
while (s2 >> token)
{
consoleOut << " " << token << '\n';
}
}
你的問題是?窄字符流使用表格查找進行分類。你的實現只適用於'char'以外的字符類型。 – 0x499602D2