是否可以使用用户定义的I / O操纵器操作某些文本

Is it possible to manipulate some text with an user-defined I/O manipulator?

本文关键字:操纵 操作 文本 可以使 用户 定义 是否      更新时间:2023-10-16

有没有一种(干净的)方法可以在将 std::cin 中的某些文本插入std::string之前对其进行操作,以便以下内容可以工作:

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

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

(非扩展)操纵器通常只设置标志和数据,提取器随后读取并做出反应。(这就是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手工制作的区域设置,从而产生大写字符串。不过,我不认为我会让这样的事情通过代码审查——它只是在等待惊喜和咬下一个处理代码的人。

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