3

在将 std::cin 中的某些文本插入 a 之前,是否有一种(干净的)方法来操作它std::string,以便以下操作:

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

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

4

2 回答 2

3

您可能想查看 boost iostreams。它的框架允许定义可以操纵流的过滤器。 http://www.boost.org/doc/libs/1_49_0/libs/iostreams/doc/index.html

于 2012-04-09T16:57:10.630 回答
3

(非扩展)操纵器通常只设置提取器随后读取并做出反应的标志和数据。(这就是xalloc,iwordpword的用途。)显然,您可以做的是编写类似于 的内容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>>。我不认为让操纵器修改底层流缓冲区的内容是一个好主意。

If you're desperate enough, I guess you could also imbue a hand-crafted locale resulting in uppercasing strings. I don't think I'd let anything like that go through a code review, though – it's simply just waiting to surprise and bite the next person working on the code.

于 2012-04-09T17:09:18.563 回答