Ich habe eine sehr einfache Protokollierungsklasse geschrieben.Wie vermeide ich # including <sstream> dank einer Template-Funktion?
Die Logging-Klasse verfügt über eine Funktion, die wie folgt aussieht:
template <typename T, typename... Args>
void log (T && first, Args &&... rest) {
log (std::forward <T> (first));
log (std::forward <Args> (rest)...);
}
template <typename T>
void log (T && last) {
/* use <sstream>'s std::ostringstream to convert each T to its string
representation, then print it via a callback. */
}
Da meine Logging-Klasse ist wahrscheinlich in meinem Programm häufig verwendet werden, ich versuche, die Menge an Code zu reduzieren, die anheften geht zu auf jede Übersetzungseinheit als Ergebnis von #includ
-ing meine Logger-Datei.
Ich habe es geschafft, alle #include
Aussagen außer <string>
aus der Header-Datei und in der Implementierungsdatei zu bewegen, außer die Gesamtheit <sstream>
und alle seine Abhängigkeiten, die für die Durchführung dieser Vorlage Memberfunktion erforderlich sind, .
Ich habe explizit instanziiert alle Überladungen, die ich brauche, aber wenn ich hoffe, meine Logger mit String-Literalen zu verwenden, dann denke ich, ich muss explizit eine Vorlage für jede n
in const char (&) [n]
instanziieren. Oder #include <type_traits>
für std::decay
. :(
Ist es möglich, zu vermeiden, dass <sstream>
in alle TUs zu ziehen, dass mein Logger zu verwenden? Wie?
Haben Sie gedacht, 'std :: to_string()' (C++ 11) zu verwenden? Sehen Sie, ob das hilft, '' zu entfernen. Für die anderen Klassen können Sie die klassenspezifische 'public' Methode' to_string() 'implementieren. –
iammilind
Vielleicht könnte [PIMPL idiom] (https://en.wikipedia.org/wiki/Opaque_pointer) relevant sein –
@iammilind Hmm. Ich könnte die Konvertierungen machen, um mich selbst zu zeichnen (mit 'to_string()' und so weiter). Ich brauche _really_ nicht '' um das zu tun. Für alles andere wäre eine "to_string" (nicht?) - Mitgliedsfunktion vollkommen akzeptabel. –