用于修改 C 中后续输出的自定义流操纵器
在 C 中,流操纵器是用于自定义和增强输入和输出操作的强大工具。一种常见的操纵器是 std::hex,它将后续数字输出的格式修改为十六进制。
但是,如果您需要一个操纵器,不仅可以向流添加其他元素,还可以修改项目的值,该怎么办那之后呢?本文探讨如何创建这样的操纵器,并通过一个简单的示例演示其用例。
具有状态存储的自定义操纵器
要修改流中的后续项目,您需要存储与每个流关联的状态信息。这可以使用 ios_base::iword 函数和 xalloc 生成的索引来实现。
inline int geti() { static int i = ios_base::xalloc(); return i; }
使用此机制,您可以定义两个操纵器:add_one 和 add_none。 add_one 将存储状态设置为 1,而 add_none 将其设置为 0。
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
自定义数字输出
C 中的数字输出由构面处理。要修改数字输出的行为,您可以定义自定义方面。在这里,我们创建一个名为 my_num_put 的自定义构面,它按存储的状态值递增每个数值。
struct my_num_put : num_put<char> { iter_type do_put(iter_type s, ios_base& f, char_type fill, long v) const { return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); } iter_type do_put(iter_type s, ios_base& f, char_type fill, unsigned long v) const { return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); } };
测试操纵器
要测试自定义操纵器,您可以向输出流注入新的构面,并使用操纵器修改数字输出。
int main() { // outputs: 11121011 cout.imbue(locale(locale(), new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
在此示例中,输出流将使用值打印数字 10、11、10 和 11前两个数字各加 1,结果为 11、12、10 和 11。
以上是如何在 C 中创建影响后续输出的自定义流操纵器?的详细内容。更多信息请关注PHP中文网其他相关文章!