ben amacının bu yapabilmek için bir günlük sınıf yazıyorumoperatörü << o çekmek veya dönmez ostream aşırı Nasıl
Orijinal Soru: Şu anda
// thread one
Logger() << "Some string" << std::ios::hex << 45;
// thread two
Logger() << L"Some wide string" << std::endl;
: Bu sınıfa hakkında
#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;
}
Bazı notlar: my Kaydedici başlığı şuna benzer
- Çapraz platform uyumluluğu sorun değil.
- Logger.cpp'nin içinde "gerçek" ostream oluşturmaya özen gösteren bir singleton sınıfı var.
- Logger yapıcısı ve deconstructor, tekil için gerekli kilitleme işlemini gerçekleştirir.
- nasıl operatörü < < fonksiyon yüzden özel olarak out_stream ayarlayabileceğiniz bir arkadaş veya üye yapabilirim:
Üç sorunları var?
Özeti: sonra arkadaşı yerine ÖNCE
- koyun şablonu.
- std :: ios :: hex bir manipülatör değildir. std :: hex bir manipülatördür.
Bitiş Sonucu (... üç noktayla) burayı printf yol yapmak ve çoklu parametre yöntemini kullanmayın neden
#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;
};
Endresult'unuz yanlış. sınıf kapsamındaki uzmanlıklara izin verilmez :) sadece onları aşırı yüklemek (şablonu <> parça atlamak) Aksi halde (o zaman normal operatör işlevleri) artık arkadaş olmadığı için Adem'in cevabında (ad alanı kapsamında uzmanlaşır) gereklidir. –
İlginç bir şekilde, onlarla orada çalıştı. Ancak, sadece doğru olmak gerekirse, onları yine de kaldırdım. Teşekkürler! –