Ich bin ein stream insertion operator für eine Klasse von mir implementieren. Ich möchte, dass meine Klasse mit schmalen und breiten Streams arbeitet. Ich benutze eine Vorlage, um diese Art von Verhalten zu ermöglichen - und alles ist unabhängig davon, welcher Stream-Typ tatsächlich verwendet wird, mit Ausnahme von Zeichenliteralen. Wenn es eine breite Zeichenfolge ist, müssen die Zeichenliterale L
dem Literal vorangestellt werden, andernfalls nicht.Wie schreibt man einen Stream Insertion Operator für den allgemeinen Fall? (Das heißt, für `char` und` wchar_t` Ströme?)
Gibt es eine Möglichkeit, diese Art von Sache auf den Template-Parameter zu tippen, so dass ich nicht so viel Code auf diesem duplizieren muss?
(ich würde es vorziehen, schmal zu breiten Charakter oder breit zu schmal Konvertierungen Zeichen zur Laufzeit, wenn möglich, zu vermeiden, durchgeführt wird.)
Beispiel von dem, was ich habe zur Zeit - es eine Schablone ist, aber es gewann‘ t Arbeit mit schmalen Zeichenströmen wegen der breiten Zeichenliterale:
template <typename charT, typename traits>
std::basic_ostream<charT, traits>& operator<<(
std::basic_ostream<charT, traits>& lhs,
const Process& rhs
)
{
lhs << L"Process (0x" << std::setw(8) << std::hex
<< std::setfill(L'0') << rhs.GetId() << L") ";
lhs << rhs.GetName() << std::endl;
lhs << L"Command Line: " << rhs.GetCmdLine() << std::endl;
const std::vector<Thread>& threads = rhs.GetThreads();
for (std::vector<Thread>::const_iterator it = threads.begin();
it != threads.end(); ++it)
{
lhs << L" --> " << *it << std::endl;
}
const std::map<void *, Module>& modules = rhs.GetModules();
for (std::map<void *, Module>::const_iterator it = modules.begin();
it != modules.end(); ++it)
{
lhs << L" --> " << it->second << std::endl;
}
return lhs;
}
Es wird mehr Spaß in C++ 0x, wenn es eine gazillion neue Charaktertypen gibt. –
Nur mit dem gleichen Problem und ich entschied mich für dalle's Lösung vorerst. Jetzt, im Jahr 2015, mit C++ 0x und sogar C++ 11 bin ich neugierig, ob es besser ist, dieses Problem zu lösen. Ich versuche nur in Streams zu gelangen ... –
@ AndreasW.Wylach: Ich habe einfach aufgegeben und mein eigenes Ding, inspiriert von Fastformats API, erstellt: https://github.com/BillyONeal/Instalog/blob/master/LogCommon/LogSink. hpp –