标志不具有约束力

标志不具有约束力

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/

10-09 13:30