2014-04-04 39 views
0

我推導了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'; 
    } 
} 
+0

你的問題是?窄字符流使用表格查找進行分類。你的實現只適用於'char'以外的字符類型。 – 0x499602D2

回答

0

窄字符流使用表查找進行分類(我假定爲優化優勢)。您的實施只適用於char以外的字符類型。您可以在C++ reference page上看到他們如何使用表格來分類字符。

1

謝謝!

我從你給的鏈接做了下面的代碼,這確實有效。

#include <iostream> 
#include <vector> 
#include <locale> 
#include <sstream> 

// This ctype facet declassifies spaces as whitespace 
struct CSV_whitespace : std::ctype<char> 
{ 
    static const mask* make_table() 
    { 
     // make a copy of the "C" locale table 
     static std::vector<mask> v(classic_table(), classic_table() + table_size); 

     // space will not be classified as whitespace 
     v[' '] &= ~space; 

     return &v[0]; 
    } 

    CSV_whitespace(std::size_t refs = 0) : ctype(make_table(), false, refs) {} 
}; 

int main() 
{ 
    std::string token; 

    std::string in = "string1\tstring2 string3"; 

    std::cout << "locale with modified ctype:\n"; 
    std::istringstream s(in); 
    s.imbue(std::locale(s.getloc(), new CSV_whitespace())); 
    while (s >> token) 
    { 
     std::cout << " " << token << '\n'; 
    } 
}