C++ OStream 继承和操纵器

C++ OStream Inheritance and Manipulators

本文关键字:操纵 继承 OStream C++      更新时间:2023-10-16

我有一个继承自ostream但操纵器无法编译的类。例如:

QLogger &logger = QLogger::getInstance();
logger << hex << 10 << endl;

抱怨logger << hex.如果我将记录器投到ostream它会起作用,但这非常笨拙。

如何扩展我的类,使其表现为带有操纵器的ostream

谢谢

肯尼

class LIBEXPORT QLogger: public std::ostream
{
    friend class boost::thread_specific_ptr< QLogger >;
    friend class QLoggerFunnel;
public:
    // Priority for message filtering.
    //
    // DEBUG   Detailed information that may be useful during development or troubleshooting.
    // NORMAL  Message will be useful during normal operation.
    // WARNING Message indicates an unhealthy condition but the system should continue to operate.
    // FAULT   Message indicates a critical error. The system may not operate normally.
    enum Priority
    {
        DEBUG, NORMAL, WARNING, FAULT
    };
    // DEPRECATED: Defined for backward compatibility.
    static const Priority LOW = NORMAL;
    static const Priority HIGH = WARNING;
    static const Priority URGENT = FAULT;
    // Returns a reference to the global instance.
    static QLogger& getInstance();
    // DEPRECATED: Use instead: QLogger::instance() << "Example message." << std::endl
    static AWI_DEPRECATED QLogger& stream( QLogger::Priority priority = NORMAL );
    QLogger &operator<<( Priority p );
    // Messages with a priority below the threshold are discarded.
    void setThreshold( Priority priority );
    Priority getThreshold( void ) const;
    // Set the priority of messages.
    void setPriority( Priority priority );
    Priority getPriority( void ) const;
protected:
    static void handleThreadExit( QLogger *logger );
    QLogger();
    QLogger( const QLogger& );
    virtual ~QLogger();
    QLogger& operator=( const QLogger& );
    void write( std::ostream &destination );
    void synchronize( void );
    // Prepends information to each line of its associated output stream.
    class StampBuffer: public std::stringbuf
    {
        public:
            StampBuffer();
            virtual ~StampBuffer();
            // String to be displayed before each line.
            void setPreamble( const char *p );
            virtual int sync();
            void write( std::ostream &destination );
        protected:
            boost::mutex _mutex;
            std::stringstream _stream1;
            std::stringstream _stream2;
            // Active stream being written to.
            std::stringstream *_write;
            std::stringstream *_read;
            const char *_preamble;
    };
    class NullBuffer: public std::stringbuf
    {
        public:
            NullBuffer();
            virtual ~NullBuffer();
            virtual int overflow( int c )
            {
                return (c);
            }
    };
    StampBuffer _buffer;
    NullBuffer _null_buffer;
    Priority _threshold;
    Priority _priority;
};

如果实现成员函数,则在重载解析中不考虑同一函数的继承重载。如果将自定义operator<<重载更改为友元全局函数而不是成员,这应该可以正常工作。强制转换强制编译从 ostream 中定义的那些中选择operator<<()

不需要函数指针的特殊重载。