Original QuestionComment surcharger l'opérateur << qui ne prend pas ou retourner ostream
J'ecrivais une classe d'exploitation forestière dont le but est de pouvoir faire:
// thread one
Logger() << "Some string" << std::ios::hex << 45;
// thread two
Logger() << L"Some wide string" << std::endl;
Actuellement mon en-tête de l'enregistreur ressemble à ceci:
#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;
}
Quelques notes sur cette classe:
- La compatibilité multiplateforme n'est pas un problème.
- À l'intérieur de Logger.cpp, il y a une classe singleton qui prend soin de créer le "vrai" ostream.
- Le constructeur de l'enregistreur et le déconstructeur effectuent le verrouillage nécessaire du singleton.
J'ai trois problèmes:
- Comment puis-je l'opérateur < < fonction d'un ami ou un membre pour que je puisse mettre out_stream en privé?
- Comment faire pour que la fonction < < de l'opérateur fonctionne pour les manipulateurs?
- Comment puis-je ajouter une spécialisation de sorte que si T est un WCHAR * ou un std :: wstring qu'il va le convertir en char * ou std :: string avant de le transmettre à out_stream? (Je peux faire la conversion Perdre les personnages de haut unicode est pas un problème dans mon cas..)
Résumé des choses apprises dans les réponses:
- Mettre modèle avant ami et non après.
- std :: ios :: hex n'est pas un manipulateur. std :: hex est un manipulateur.
Résultat final
#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;
};
Votre résultat est incorrect. Il suffit de les surcharger à la place (omettre le modèle <> partie). Cela est nécessaire dans la réponse d'Adam (qui les spécialise dans l'espace des espaces de noms), sinon les fonctions (alors normales) ne sont plus des amis. –
intéressant, il a travaillé avec eux là-bas. Mais, juste pour être correct, je les ai enlevés quand même. Merci! –