Frage zu Templates und std::ofstream
-
Hallo liebe Community
ich habe mir zum reporten von Errormeldungen folgenden Code geschriebentemplate <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
intangenommen, jedoch nicht ausgegeben, nur strings werden ausgegeben. Das heißt das bei so einem Aufruferr(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.