ストリーム挿入演算子をオーバーロードするロガー クラスを開発しています。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