Frage zu Templates und std::ofstream



  • Hallo liebe Community
    ich habe mir zum reporten von Errormeldungen folgenden Code geschrieben

    template <typename T> void err(const T& error) {
    	static std::ofstream of("test.txt");
    	of << error << std::endl;
    }
    

    Jedoch wird bei dem Code zwar auch ein Paramter vom Typ int angenommen, jedoch nicht ausgegeben, nur strings werden ausgegeben. Das heißt das bei so einem Aufruf

    err(1);
    err("test");
    

    nur "test" in die Datei reingeschrieben wird, aber nicht 1. Woran liegt das? Mein Compiler ist MSVC10.

    PS:
    Gibt es ein AddOn oder sowas in der Art, damit der MSVC10 Compiler auch Variadic Templates unterstützt, damit ich sowas hier verwirklichen kann?

    template <typename A1, typename... Args> void err(A1 a1, Args... args) {
    	static std::ofstream of("test.txt");
    	of << a1 << std::endl;
    	err(args...);
    }
    


  • Kann der Compiler variadic macros?



  • Noaea schrieb:

    Das heißt das bei so einem Aufruf

    err(1);
    err("test");
    

    nur "test" in die Datei reingeschrieben wird, aber nicht 1. Woran liegt das?

    Wenn Du diese beiden Aufrufe machst, werden zwei verschiedene Funktionen erstellt, nämlich diese beiden:

    void err(const int& error) {
        static std::ofstream of("test.txt");
        of << error << std::endl;
    }
    
    void err(const string& error) {
        static std::ofstream of("test.txt");
        of << error << std::endl;
    }
    

    und wenn Dein zweiter Aufruf kommt, wird die Datei, die der erste Aufruf erstellt hat, überschrieben.



  • Jedes Template hat seinen eigenen statischen ofstream -> du überschreibst die Daten einfach.
    Eine Lösung wäre einmaliges Öffnen (Löschen) am Anfang des Programms und den Streams in den Templates das Flag std::ios::app auf den Weg geben.

    Oder eben ein global zugänglicher ofstream.



  • Noaea schrieb:

    PS:
    Gibt es ein AddOn oder sowas in der Art, damit der MSVC10 Compiler auch Variadic Templates unterstützt, damit ich sowas hier verwirklichen kann?

    Nein, das wird in der nächsten Version (ich glaube 2012) hinzugefügt.


Anmelden zum Antworten