在将其插入std::string之前,是否有一种(干净的)方式来处理std::cin中的某些文本,因此以下各项将起作用:

cin >> setw(80) >> Uppercase >> mystring;

其中mystring是std::string(我不想对字符串使用任何包装器)。Uppercase是一个操纵器。我认为它需要直接作用于缓冲区中的Chars(无论现在是大写还是小写)。这样的操纵器似乎很难以干净的方式实现,因为据我所知,用户定义的操纵器仅用于轻松地更改或混合一些预定的格式标志。

最佳答案

(非扩展)操纵器通常仅设置标志和数据,提取器随后读取并对其作出 react 。 (这就是xallociwordpword的目的。)显然,您可以做的是编写类似于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/

10-08 21:31