OOP Design Frage - tracebuffer messages



  • Hi,
    [Ich bin mir nicht sicher, ob das vielleicht im C++ Forum besser aufgehoben wäre, wenn ja einfach verschieben..]

    es geht um folgendes: Normalerweise benutzt man ja in C++ ein stream interface für den output (cout << "foo" << bar;), mit den offensichtlichen Vorteilen der Erweiterbarkeit und Typsicherheit. Ein Projekt an dem ich arbeite stellt gerade allen output von einem solchen stream I/O interface auf printf um, um tracebuffer und debugging output zu vereinheitlichen. Ein tracebuffer funktioniert hier etwa so, dass eine Funktion zusammen mit einem Kennzeichner (etwa event-id) und einigen Datenwerten aufgerufen wird. Diese Infos werden dann in eine Art log geschrieben. Im debugger kann man das log anzeigen lassen. Problem ist hier die Interpretation der Daten. Entweder der debugger macht das (also in abhängigkeit der event-id die daten so und so interpretieren und anzeigen), oder, was zur zeit gemacht wird, es wird ein zusätzlicher Format string übergeben, der dann in printf-manier ausgegeben wird. Vom code her etwa:

    void trace( event_id_t ev, int arg, const char* format ) // nur ein argument hier aus gründen der einfachheit
    {
      if( want_traced( ev ) )
        log.append( ev, arg, format );
    }
    
    // im debugger
    if( show_ev( log_it->ev ) )
      printf( log_it->format, log_it->arg );
    

    Aus Speicherplatzgründen und weil die Argumente mit unter auch direkt interpretiert werden sollen kann nicht einfach die ganze ausgabe geloggt werden.

    Wie könnte man das in ein vernünftig erweiterbares, typsicheres C++ interface fassen?



  • Schau dir vielleicht mal boost::format an.



  • Ich kenne boost.format, aber das löst mein Problem nicht wirklich, weil die ausgabe darauf beruht, dass der Typ zur compilierzeit an der Stelle im code bekannt ist, was bei einem gemischten log nicht ohne weiteres gegeben ist.



  • ness schrieb:

    Wie könnte man das in ein vernünftig erweiterbares, typsicheres C++ interface fassen?

    Typsicher und printf schließen sich gegenseitig aus.



  • in C++ könnte man RTTI benutzen, ansonsten wirds wohl schwierig mit der übergabe des typs.
    🙂


Anmelden zum Antworten