2010-03-16 1 views
4

내가 템플릿을 기반으로 파일에서 읽을 수있는 프로그램을 받고 문제가 있어요 :C++ : 함수 이름에 문자 유형을 명시하지 않고 읽고 쓸 수있는 좋은 방법이 있습니까? 예를 들어 (wcout 대 COUT 등)

bool parse(basic_ifstream<T> &file) 
{ 
    T ch; 
    locale loc = file.getloc(); 
    basic_string<T> buf; 
    file.unsetf(ios_base::skipws); 
    if (file.is_open()) 
    { 
     while (file >> ch) 
     { 
      if(isalnum(ch, loc)) 
      { 
       buf += ch; 
      } 
      else if(!buf.empty()) 
      { 
       addWord(buf); 
       buf.clear(); 
      } 
     } 
     if(!buf.empty()) 
     { 
      addWord(buf); 
     } 
     return true; 
    } 
    return false; 
} 

이 내가 <char>이 클래스의 인스턴스를 사용할 수는 있지만, 것입니다 <wchar_t> (분명히)을 사용할 때 문제가 있습니다.

클래스의 외부, 내가 사용하고 있습니다 : 예상대로 iter->firstchar가 아닌 경우

for (iter = mp.begin(); iter != mp.end(); ++iter) 
{ 
    cout << iter->first << setw(textwidth - iter->first.length() + 1); 
    cout << " " << iter->second << endl; 
} 

는, cout을 폭발을이 데이터 구조체 (그것은 map<basic_string<T>, int>있어)에서 모든 정보를 작성하고 정렬.

온라인으로 보았지만 wcout을 사용하는 것이 합의되었지만이 프로그램은 컴파일 타임에 템플릿을 변경할 수 있어야하므로 (<char> -><wchar_t>) 나는 어떻게 빠져 나갈 수 있는지 잘 모르겠습니다. 단순히 cout 또는 wcout을 선택하십시오. 즉, 많은 코드를 변경하지 않고 넓은 문자를 읽고 쓸 수있는 방법이 없으면 않습니다.

이 설명이 어색하게 복잡하게 들리면 알려주세요. 가능한 한 최선을 다해 답변 해 드리겠습니다.

답변

6

특성 클래스를 사용하십시오. 코드에서 직접 cout을 참조하는 대신 traits<T>::cout을 참조하고 traits<char>을 std :: cout으로, traits<wchar_t>을 wcout로 지정하면됩니다.

업데이트

template <typename T> 
class traits { 
public: 
    static std::basic_ostream<T>& tout; 
}; 

template<> 
std::ostream& traits<char>::tout = std::cout; 

template<> 
std::wostream& traits<wchar_t>::tout = std::wcout; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    traits<char>::tout<<"Ascii"; 
    traits<wchar_t>::tout<<L"Unicode"; 
    return 0; 
} 
0

물론, 단지 템플릿을 재정의하고 형식 정의 사용

typedef std::basic_string<tchar_t> tstring 
:

#ifdef USE_UNICODE 
typedef wchar_t tchar_t 
#else 
typedef unsigned char tchar_t 
#endif 

이 그럼 당신은 대부분의 표준 C++ 기능/용기의 템플릿을 사용할 수 있습니다

관련 문제