Possible Duplicate:
“Roll-Back” or Undo Any Manipulators Applied To A Stream Without Knowing What The Manipulators Were
考虑以下代码
int temp=256;
cout<<temp<<endl;
cout<<hex<<temp<<endl;
cout<<temp<<endl;
输出分别为“ 256”,“ 100”和“ 100”。
是否可以使“ hex”标志不具有约束力?
我不想明确地写“ dec”。
最佳答案
不适用于标准机械手。但实际上,您可能
不应使用标准操纵器(除了
例);它们对应于物理标记,在应用程序中,您
想要使用逻辑标记。你想写类似
cout << temperature << roomTemperature;
,其中温度是特定于应用程序的操纵器,
(全球)应该如何输出温度。这样,如果
规格有所变化,并且要求使用不同的温度格式,
您只需要在一处更改它。调试输出有些
这里有一个例外,但即使在那里,编写起来也容易得多
就像是:
cout << HexFmt( 4 ) << var;
比
cout << hex << setfill( '0' ) << setw( 4 ) << var;
(而且您可能经常会使用
HexFmt
之类的东西有理由将其包含在您的工具箱中。)
您编写的操纵器可以用来恢复
至少在完整表达式的末尾处于先前状态。我全部
机械手从以下类别派生:
StateSavingManip.hh:
class StateSavingManip : boost::noncopyable
{
mutable std::ios* myStream;
mutable std::ios::fmtflags
mySavedFlags;
mutable int mySavedPrec;
mutable char mySavedFill;
private:
virtual void setState( std::ios& stream ) const = 0;
protected:
StateSavingManip();
public:
StateSavingManip( StateSavingManip const& other );
virtual ~StateSavingManip();
void operator()( std::ios& stream ) const;
};
inline std::ostream&
operator<<(
std::ostream& out,
StateSavingManip const&
manip )
{
manip( out );
return out;
}
inline std::istream&
operator>>(
std::istream& in,
StateSavingManip const&
manip )
{
manip( in );
return in;
}
StateSavingManip.cc:
namespace {
int getXAlloc();
int ourXAlloc = getXAlloc() + 1;
int
getXAlloc()
{
if ( ourXAlloc == 0 ) {
ourXAlloc = std::ios::xalloc() + 1;
assert( ourXAlloc != 0 );
}
return ourXAlloc - 1;
}
}
StateSavingManip::StateSavingManip()
: myStream( NULL )
{
}
StateSavingManip::StateSavingManip(
StateSavingManip const&
other )
{
assert( other.myStream == NULL );
}
StateSavingManip::~StateSavingManip()
{
if ( myStream != NULL ) {
myStream->flags( mySavedFlags );
myStream->precision( mySavedPrec );
myStream->fill( mySavedFill );
myStream->pword( getXAlloc() ) = NULL;
}
}
void
StateSavingManip::operator()(
std::ios& stream ) const
{
void*& backptr = stream.pword( getXAlloc() );
if ( backptr == NULL ) {
backptr = const_cast< StateSavingManip* >( this );
myStream = &stream;
mySavedFlags = stream.flags();
mySavedPrec = stream.precision();
mySavedFill = stream.fill();
}
setState( stream );
}
它允许类似以下的简单内容:
class HexFmt : public StateSavingManip
{
int myWidth;
protected:
virtual void setState( std::ios& targetStream ) const
{
targetStream.flags( std::ios::hex | std::ios::uppercase );
targetStream.width( myWidth );
targetStream.fill( '0' );
}
public:
explicit HexFmt( int width )
: myWidth( width )
{
}
};
关于c++ - 如何在C++中使格式标志不具有约束力? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7428137/