是否可以使用用户定义的I / O操纵器操作某些文本
Is it possible to manipulate some text with an user-defined I/O manipulator?
有没有一种(干净的)方法可以在将 std::cin 中的某些文本插入std::string
之前对其进行操作,以便以下内容可以工作:
cin >> setw(80) >> Uppercase >> mystring;
其中 mystring 是std::string
的(我不想对字符串使用任何包装器)。 Uppercase
是一个操纵者。我认为它需要直接作用于缓冲区中的字符(无论现在被认为是大写而不是小写)。这样的操纵器似乎很难以干净的方式实现,因为据我所知,用户定义的操纵器用于轻松更改或混合一些预先确定的格式标志。
(非扩展)操纵器通常只设置标志和数据,提取器随后读取并做出反应。(这就是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
手工制作的区域设置,从而产生大写字符串。不过,我不认为我会让这样的事情通过代码审查——它只是在等待惊喜和咬下一个处理代码的人。
你可能想看看提升iostreams。 它的框架允许定义可以操作流的过滤器。 http://www.boost.org/doc/libs/1_49_0/libs/iostreams/doc/index.html
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 重载操作程序时出错>>用于类中的字符串 memebr
- 对字符串进行位操作
- 我可以在 C++ 中的函数体之外进行操作吗?
- MPI突然停止了对多个核心的操作
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- C++setiosflags函数操纵器-未确定的缩进
- 对字符数组中的元素执行逐位操作
- 如何在directx/c++中进行平移/缩放操作
- 逐位操作的隐式类型转换
- 为什么一个向量上的多线程操作很慢
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 位移操作和位掩码未检测到重复字符
- 如何进行特定的位操作?
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 字符串操作 - 字符计数
- 此代码中的操作流程是什么?C/C++.
- 复制和交换习惯用法与移动操作之间的交互
- 如何操纵两个具有算术操作的参数的结果
- 是否可以使用用户定义的I / O操纵器操作某些文本