2

ストリーム挿入演算子をオーバーロードするロガー クラスを開発しています。std::flushマニピュレーターをキャッチするのに苦労しています。

まず、私がやっていることの簡単な要約:

のオブジェクトが与えられた場合LogClass、次のことを行います。

LogClass logger;
logger << "Some text" << std::flush;

std::flush...そしてマニピュレータをキャッチします。

すべての入力は、次のインライン演算子によって後でログに記録するために、内部文字列ストリームに直接送信されます (正常に動作します)。

class LogClass
{
    // ...

    std::ostringstream m_internalStream;

    template <typename T>
    LogClass & operator<<(const T & rhs)
    {
        m_internalStream << rhs;
        return *this;
    }

    // ...
};

次のようにオーバーロードしてマニピュレーターをキャッチしようとしてstd::flushいます (これも正常に動作します)。

LogClass & LogClass::operator<<(std::ostream & (*manip)(std::ostream &))
{
    std::ostream & (* const flushFunc)(std::ostream &) = std::flush;

    // Is the supplied manipulator the same as std::flush?
    if ((manip == flushFunc)) {
        flush(); // <-- member function of LogClass
    } else {
        manip(m_stream);
    }

    return *this;
}

flushFunc次のように、ローカル変数を静的にしようとすると問題が発生します。

static std::ostream & (* const flushFunc)(std::ostream &) = std::flush;

この場合、着信manipポインタの値はと等しくありませんflushFunc

何故ですか?std::flushの関数のテンプレートのインスタンス化と関係がありますcharか?

MS Visual Studio 2010 Pro を使用しています。

この問題は、次の小さな作業コード スニペットにも示されています。

#include <iostream>
#include <iomanip>

int main(int, char **)
{
    static std::ostream & (* const staticFlushPtr)(std::ostream &) = std::flush;
    std::ostream & (* const stackFlushPtr)(std::ostream &) = std::flush;

    std::cout << std::hex <<
            "staticFlushPtr: " << (void *) staticFlushPtr << "\n"
            "stackFlushPtr: " << (void *) stackFlushPtr << "\n";

    return 0;
}

...これにより、私のマシンで次の出力が得られます。

staticFlushPtr: 013F1078
stackFlushPtr: 0FF10B30

何か案は?

よろしく、 Rein A. Apeland

4

1 に答える 1

1

これは、コンパイラの明確なバグのようです。DLLなどが含まれていれば、それを理解するか、少なくとも言い訳をすることができますが、あなたのような些細な例ではmain...(g ++はそれを正しく理解しています。)

私が提案できるのは、出力にフィルタリング streambuf を挿入して、 への呼び出しをキャッチすることだけsyncです。

于 2014-01-16T14:58:32.403 に答える