Original QuestionWie zu überlasten Operator <<, dass nimmt oder nicht zurück Ostream
ich eine Logging-Klasse bin writting, wo das Ziel dieser Lage sein, zu tun:
// thread one
Logger() << "Some string" << std::ios::hex << 45;
// thread two
Logger() << L"Some wide string" << std::endl;
Aktuell mein Logger Header etwas wie folgt aussieht:
#pragma once;
#include <ostream>
class Logger
{
public:
Logger();
~Logger();
std::ostream* out_stream;
};
template <typename T>
Logger& operator<< (Logger& logger, T thing) {
*logger.out_stream << thing;
return logger;
}
Einige Anmerkungen zu dieser Klasse:
- Plattformübergreifende Kompatibilität ist kein Problem.
- Innerhalb von Logger.cpp gibt es eine Singleton-Klasse, die für die Erstellung der "echten" Ostream sorgt.
- Der Logger-Konstruktor und Dekonstruktor führen die erforderliche Verriegelung des Singleton durch.
Ich habe drei Probleme:
- Wie kann ich den Bediener < < Funktion ein Freund oder ein Mitglied, so kann ich out_stream als privat?
- Wie mache ich den Operator < < Funktion arbeiten für Manipulatoren?
- Wie kann ich eine Spezialisierung hinzufügen, so dass, wenn T ein WCHAR * oder std :: wstring ist, es in char * oder std :: string konvertiert wird, bevor es an out_stream übergeben wird? (Ich kann die Umwandlung tun verlieren hohe Unicode-Zeichen ist kein Problem in meinem Fall..)
Zusammenfassung der Dinge in Antworten gelernt:
- Put Vorlage VOR Freund stattdessen nach der.
- std :: ios :: hex ist kein Manipulator. std :: hex ist ein Manipulator.
End Ergebnis
#pragma once
#include <ostream>
#include <string>
std::string ConvertWstringToString(std::wstring wstr);
class Logger
{
public:
Logger();
~Logger();
template <typename T>
Logger& operator<< (T data) {
*out << data;
return *this;
}
Logger& operator<< (std::wstring data) {
return *this << ConvertWstringToString(data);
}
Logger& operator<< (const wchar_t* data) {
std::wstring str(data);
return *this << str;
}
private:
std::ostream* out;
};
Ihr Endergebnis ist falsch. Spezialisierungen im Klassenbereich sind nicht erlaubt :) einfach überladen sie stattdessen (das Template <> Teil weglassen) Es ist erforderlich in Adams Antwort (die sie auf Namespace-Bereich spezialisiert), da sonst die (dann normalen Operatorfunktionen) keine Freunde mehr sind. –
Interessanterweise hat es dort mit ihnen funktioniert. Aber um richtig zu sein, habe ich sie trotzdem entfernt. Vielen Dank! –