我在使用基于模板的文件读取程序时遇到问题,例如:
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;
}
要写入此数据结构中的所有信息(它是map<basic_string<T>, int>
),并且如预测的那样,如果iter->first
不是char
数组,则cout会爆炸。
我已经在线查看,并且共识是使用wcout,但不幸的是,因为这个程序要求在编译时可以更改模板(<char>
- &gt; <wchar_t>
)我是只是选择cout或wcout,我不知道如何逃脱。也就是说,除非有办法在不改变大量代码的情况下读/写宽字符。
如果这个解释听起来很复杂,请告诉我,我会尽力解决。
答案 0 :(得分: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;
}
答案 1 :(得分: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
等