4

我在让程序从基于模板的文件中读取时遇到问题,例如:

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>(显然)时会出现问题。

在课堂之外,我正在使用:

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

要写入此数据结构(它是 a map<basic_string<T>, int>)中的所有信息,并且正如预测的那样,如果iter->first不是char数组,则 cout 会爆炸。

我在网上查看过,共识是使用 wcout,但不幸的是,由于该程序要求可以在编译时更改模板(<char>-> <wchar_t>)我不确定如何简单地选择 cout 或 wcout。也就是说,除非有办法在不更改大量代码的情况下读取/写入宽字符。

如果这个解释听起来很复杂,请告诉我,我会尽我所能解决它。

4

2 回答 2

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;
}
于 2010-03-16T23:14:37.980 回答
0

当然,只需重新定义模板并使用 typedef:

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

然后您可以使用大多数标准 C++ 函数/容器的模板:

typedef std::basic_string<tchar_t> tstring

等等

于 2010-03-16T23:16:19.767 回答