为了账号安全,请及时绑定邮箱和手机立即绑定

C ++自定义流操纵器,可更改流中的下一项

C ++自定义流操纵器,可更改流中的下一项

C++
临摹微笑 2019-12-17 09:58:07
在C ++中,要打印十六进制数字,请执行以下操作:int num = 10;std::cout << std::hex << num; // => 'a'我知道我可以创建一个仅向流中添加内容的操纵器,如下所示:std::ostream& windows_feed(std::ostream& out){    out << "\r\n";    return out;}std::cout << "Hello" << windows_feed; // => "Hello\r\n"但是,如何创建一个类似于“ hex”的操纵器来修改要出现在流中的项目?作为一个简单的示例,我将如何在此处创建plusone机械手?:int num2 = 1;std::cout << "1 + 1 = " << plusone << num2; // => "1 + 1 = 2"// note that the value stored in num2 does not change, just its display above.std::cout << num2; // => "1"
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

首先,您必须将一些状态存储到每个流中。您可以使用函数iword和传递给它的索引来实现,该函数由给出xalloc:


inline int geti() { 

    static int i = ios_base::xalloc();

    return i;

}


ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } 

ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

有了适当的设置,您已经可以在所有流中检索某些状态。现在,您只需要加入相应的输出操作即可。数值输出由构面完成,因为它可能取决于语言环境。所以你可以做


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;

}

如果您只想增加下一个数字,只需0在每次调用后将单词再次设置为do_put。


查看完整回答
反对 回复 2019-12-17
?
SMILET

TA贡献1796条经验 获得超4个赞

我完全同意Neil Butterworth的观点,但是在特定情况下,您使用的是这种完全骇人听闻的技巧。不要在任何生产代码中执行此操作。它有很多错误。一方面,它仅适用于您的单行代码,而不会更改基础流的状态。


class plusone_stream : public std::ostream

{

  public:

    std::ostream operator<<(int i)

    {

      _out << i+1;

      return *this;

    }

};


std::ostream& plusone(std::ostream& out)

{

    return plusone_stream(out);

}


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 456 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信