从Unix到Linux移植ostream :: opfx/osfx
问题描述:
我将一些C++代码从Unix移植到Linux(Red Hat)。从Unix到Linux移植ostream :: opfx/osfx
我遇到了以下模式:
ostream& myfunction(ostream& os)
{
if (os.opfx())
{
os << mydata;
os.osfx();
}
return os;
}
功能opfx
和osfx
不可用红帽4.5。我看到一个建议here使用ostream::sentry
功能:
ostream& myfunction_ported(ostream& os)
{
ostream::sentry ok(os);
if (ok)
{
os << mydata;
}
return os;
}
我从here看到的opfx
目的是冲洗,并继续之前验证流的状态。
我的问题:
我以为ostream
功能已经检查过流状态的流进行操作之前。这是真的?这在某些时候是不是真的?
是否需要替换opfx
和sentry
? sentry
给我说operator<<
不是已经给我了吗?
答
任何现有的插件(除非它真的是可怕的越野车)已经在创建一个哨兵对象,所以只要您通过现有的插件来完成您的工作,您就不需要自己创建一个哨兵对象。
你做需要创造,当你直接写你的数据在自己的流缓冲区哨兵对象,没有任何现有插件的帮助(例如,当你不使用其他任何将创建一个哨兵给你)。
对于这段代码,你可以完全消除创建哨兵对象,并做一些事情,如:
ostream& myfunction(ostream& os)
{
return os << mydata;
}
注意的是,现有的代码被宣布为返回ostream &
,但似乎并没有真正返回任何东西。
谢谢你的建议。我在输入两个样品时错过了退货声明,并修复了它。 – Bill 2010-08-13 18:51:30