C++:有没有什么好的方法可以在函数名称中不明确说明字符类型的情况下进行读/写? (cout 与 wcout 等)
我在让程序从基于模板的文件中读取数据时遇到问题,例如:
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;
}
当我使用
实例化此类时,这会起作用,但当我使用 < code>
在课堂之外,我正在使用:
for (iter = mp.begin(); iter != mp.end(); ++iter )
{
cout << iter->first << setw(textwidth - iter->first.length() + 1);
cout << " " << iter->second << endl;
}
写入此数据结构中的所有信息(它是一个 map
),并且正如预测的那样,如果 cout 会爆炸>iter->first
不是 char
数组。
我在网上查了一下,共识是使用wcout,但不幸的是,由于这个程序要求可以在编译时更改模板(
->
) 我不确定如何通过简单地选择 cout 或 wcout 来逃脱。也就是说,除非有一种方法可以在不更改大量代码的情况下读取/写入宽字符。
如果这个解释听起来有点复杂,请告诉我,我会尽力解决。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用特征类。您无需在代码中直接引用 cout,而是引用
traits::cout
,然后将traits
专门化为 std::cout 和traits< ;wchar_t>
到 wcout。已更新
Use a traits class. Instead of referencing directly cout in code, you'd reference
traits<T>::cout
and then specializetraits<char>
to std::cout andtraits<wchar_t>
to wcout.Updated
当然,只需重新定义模板并使用 typedef:
然后您就可以使用大多数标准 C++ 函数/容器的模板:
等等。
Sure, just redefine the templates and use a typedef:
Then you can use the templates of most standard C++ functions/containers:
etc.