C++标准库笔记:13.12.4 以非格式化函数完成自定义IO操作符

自定义IO操作符时,我们可以使用stream内部对基本型别定义的operator<<各operator>>来组合完成我们复杂的数据格式化;也可以使用IO非格式化函数(如read,get,write等stream的成员函数)来组合完成自定义。

观察stream对IO操作符的实现,我们发现,其实现中都会构造一个sentry(岗哨)对象,然后根据这个对象来判断流是否可以进行读写,再决定是否开始读写流。如下,是Stream对int类型的operator<<实现(说明:删除了部分代码)

_Myt& __CLR_OR_THIS_CALL operator<<(int _Val)
{   // insert an int
    const sentry _Ok(*this);
    if (_Ok)
    {   // state okay, use facet to insert

        //do something
        //...

        return (*this);
    }
}

书中说到:

如果某个IO操作符使用了一个非格式化的IO函数,或是直接对缓冲区进行操作,那么第一件要做的事情就应该构建一个对应的sentry对象,其余处理应该取决于该对象的状态。

我对以上说法抱有怀疑态度,我认为使用非格式化的IO函数没有必要构造一个sentry对象,若使用的是直接对缓冲区进行操作来实现的话,就有必要构造了。查看流对非格式化IO函数的任意一个实现,发现其内部均会构造一个sentry对象,如下(vs2005版本):

_Myt& __CLR_OR_THIS_CALL write(const _Elem *_Str,
    streamsize _Count)
{   // insert _Count characters from array _Str
    _DEBUG_POINTER(_Str);
    ios_base::iostate _State = ios_base::goodbit;
    const sentry _Ok(*this);

    if (!_Ok)
        _State |= ios_base::badbit;
    else
        {   // state okay, insert characters
        _TRY_IO_BEGIN
        if (_Myios::rdbuf()->sputn(_Str, _Count) != _Count)
            _State |= ios_base::badbit;
        _CATCH_IO_END
        }

    _Myios::setstate(_State);
    return (*this);
}

简单说下sentry这个类,在其构造函数中对流进行预处理,析构时负责对应的后处理(具体内部做了什么操作,从源码中去找答案吧)。此类还实现了对bool类型的转换,从而可以使用此类对象进行bool操作,判断流状态是否正常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值