stringstream temporäres ostream return problem

Ich erstelle einen Logger mit den folgenden Abschnitten:

// #define LOG(x) // for release mode
#define LOG(x) log(x)

log(const string& str);
log(const ostream& str);

Mit der Idee zu tun:

LOG("Test");
LOG(string("Testing") + " 123");
stringstream s;
LOG(s << "Testing" << 1 << "two" << 3);

Das funktioniert alles wie vorgesehen, aber wenn ich es tue:

LOG(stringstream() << "Testing" << 1 << "two" << 3);

Es funktioniert nicht:

void log(const ostream& os)
{
  std::streambuf* buf = os.rdbuf();
  if( buf && typeid(*buf) == typeid(std::stringbuf) )
  {
    const std::string& format = dynamic_cast<std::stringbuf&>(*buf).str();
    cout << format << endl;
  }
}

führt zu "Format", das Junk-Daten anstelle der üblichen korrekten Zeichenfolge enthält.

Ich denke, das liegt daran, dass der temporäre Ostream, der vom Operator << zurückgegeben wird, den String-Stream überlebt, von dem er stammt.

Oder liege ich falsch?

(Warum funktioniert string () so? Liegt es daran, dass es einen Verweis auf sich selbst zurückgibt? Ich gehe davon aus, dass dies der Fall ist.)

Ich würde es wirklich gerne so machen, da ich eine zusätzliche Zuordnung beim Einloggen in den Freigabemodus eliminieren würde.

Alle Hinweise oder Tricks, um dies zu erreichen, sind willkommen. In meiner eigentlichen Lösung habe ich viele verschiedene Protokollfunktionen und sie sind alle komplexer als diese. Also würde ich es vorziehen, wenn dies irgendwie im aufrufenden Code implementiert wäre. (Und nicht, indem ich mein #define ändere, wenn möglich)

Nur um eine Idee zu geben, ein Beispiel für eine meiner tatsächlichen #Definitionen:

#define LOG_DEBUG_MSG(format, ...) \
  LogMessage(DEBUG_TYPE, const char* filepos, sizeof( __QUOTE__( @__VA_ARGS__ )), \
  format, __VA_ARGS__)

Dies entspricht den printf-ähnlichen Protokollfunktionen von varargs, die char *, string () und ostream () verwenden, sowie den Nicht-vararg-Funktionen, die string (), exception () und HRESULT verwenden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage