我在让程序根据模板从文件中读取时遇到问题,例如:
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
则 cout 爆炸不是 char
数组。
我在网上看过,一致认为是使用 wcout,但不幸的是,由于该程序要求可以在编译时更改模板 ( <char>
-> <wchar_t>
),我不确定我该怎么做只需选择 cout 或 wcout 即可。也就是说,除非有一种方法可以在不更改大量代码的情况下读取/写入宽字符。
如果这个解释听起来复杂得令人尴尬,请告诉我,我会尽力解决。
最佳答案
使用特征类。您无需在代码中直接引用 cout,而是引用 traits<T>::cout
然后专攻traits<char>
到 std::cout 和 traits<wchar_t>
想知道。
已更新
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;
}
关于C++:有没有什么好的读/写方法而不用在函数名中特别说明字符类型? (cout 与 wcout 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2458806/