0

私はマクロを使用してロギングメカニズムに取り組んでいます:

#define LOGFATAL 1 // very serious errors
#define TOSTRING(s) dynamic_cast< std::ostringstream & >((std::ostringstream() << s ) ).str()

#define LOG_TRANSFER(t, s) "[" << t << "] " << s

void inline print_log(const char *level, const std::string& value)
{
    std::cout << "[" << timestamp() << "]["<< level << "]" << value << std::endl;
}

#ifdef DEBUGGING
    #define DEBUG_OUT(l, s) print_log(l, TOSTRING(s));
#else
    #define DEBUG_OUT(s, l)
#endif


#if DEBUGGING >= LOGFATAL
    #define LOG_FATAL(s)        DEBUG_OUT("FATAL", s)
#else
    #define LOG_FATAL(s)
#endif

私はそれを彼のやり方で使用します:LOG_TRACE(LOG_TRANSFER(ptr、 "MemoryManager>割当"))LOG_TRACE( "MemoryManager>サイズ:" << active_list.size())

gccの機能は次のとおりです。

print_log("TRACE", dynamic_cast< std::ostringstream & >((std::ostringstream() << "[" << ptr << "] " << "MemoryManager > allocate " ) ).str());
print_log("TRACE", dynamic_cast< std::ostringstream & >((std::ostringstream() << "MemoryManager > size : " << active_list.size() ) ).str());

これは私には問題ないように見えますが、次の出力が得られます。

[0 s][TRACE]0x80940d40x9988ea8] MemoryManager > allocate 
[0 s][TRACE]0x80941e01

間違いはどこにありますか?

4

1 に答える 1

4

問題はこれにあります:

dynamic_cast< std::ostringstream & >((std::ostringstream() << s )).str()

またはこれでより正確に:

std::ostringstream() << s

その理由は、すべての非メンバーオーバーロードが最初の引数を非定数参照であるとして取るため、式std::ostringstream()が非メンバーオーバーロードを呼び出すことができない一時オブジェクトであるためです。ただし、一時参照を非定数参照にバインドすることはできません。したがって、を印刷するときにメンバー関数が呼び出され、これが変換されてアドレスが印刷されます。<<<<std::ostream&char*void*

あなたは少しハックする必要があります。一時オブジェクト(右辺値)を次のように参照型(左辺値)に変換します。

std::ostringstream().flush() << s

なぜ私はflush()そのように呼ぶのですか?

一時オブジェクトのメンバー関数を呼び出すことができます。非定数参照であり、必要なものがflush()返されるため、私は選択しました。std::ostream&

違いは次のとおりです。

std::ostringstream() << "nawaz" ; //it prints the address of "nawaz".
std::ostringstream().flush() << "nawaz" ; //it prints "nawaz"

1つ目はアドレスを出力するメンバーを呼び出し、2つ目はc文字列を出力するoperator<<非メンバーを呼び出します。operator<<それが舞台裏の違いです。

だからこれを試してみてください:

dynamic_cast< std::ostringstream & >((std::ostringstream().flush() << s )).str()

それはうまくいくはずです。

static_castまた、あなたがすでにタイプを知っているので、私はここで提案します:

static_cast< std::ostringstream & >((std::ostringstream().flush() << s )).str()

RTTIには依存しません。

于 2012-08-28T16:15:53.783 に答える