在将其插入std::string
之前,是否有一种(干净的)方式来处理std::cin中的某些文本,因此以下各项将起作用:
cin >> setw(80) >> Uppercase >> mystring;
其中mystring是
std::string
(我不想对字符串使用任何包装器)。Uppercase
是一个操纵器。我认为它需要直接作用于缓冲区中的Chars(无论现在是大写还是小写)。这样的操纵器似乎很难以干净的方式实现,因为据我所知,用户定义的操纵器仅用于轻松地更改或混合一些预定的格式标志。 最佳答案
(非扩展)操纵器通常仅设置标志和数据,提取器随后读取并对其作出 react 。 (这就是xalloc
,iword
和pword
的目的。)显然,您可以做的是编写类似于std::get_money
的内容:
struct uppercasify {
uppercasify(std::string &s) : ref(s) {}
uppercasify(const uppercasify &other) : ref(other.ref) {}
std::string &ref;
}
std::istream &operator>>(std::istream &is, uppercasify uc) { // or &&uc in C++11
is >> uc.ref;
boost::to_upper(uc.ref);
return is;
}
cin >> setw(80) >> uppercasify(mystring);
或者,
cin >> uppercase
可以不返回对cin
的引用,而可以返回某些(模板)包装类uppercase_istream
的实例化,并带有operator>>
的相应重载。我不认为让操纵器修改底层流缓冲区的内容是一个好主意。如果您足够绝望,我想您也可以
imbue
一个手工制作的语言环境,从而产生大写的字符串。不过,我认为我不会让任何类似的事情通过代码审查–只是在等待让下一个从事代码工作的人感到惊讶和咬人而已。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。关于c++ - 是否可以使用用户定义的I/O操纵器操纵某些文本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10076471/