나는 목적이 할 수있을 것입니다 로깅 수준을 writting하고연산자 << 그 취하거나 반환하지 않습니다 ostream에 과부하하는 방법
원래 질문 : 현재
// thread one
Logger() << "Some string" << std::ios::hex << 45;
// thread two
Logger() << L"Some wide string" << std::endl;
을
:이 클래스에 대한#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;
}
일부 노트 : 내 로거 헤더는 다음과 같이 보입니다
- 플랫폼 간 호환성은 문제되지 않습니다.
- Logger.cpp 내부에는 "실제"ostream 생성을 담당하는 싱글 톤 클래스가 있습니다.
- 로거 생성자 및 deconstructor가 필요한 싱글 톤 잠금을 수행합니다.
- 가 어떻게 조작 < < 기능 그래서 비공개로 out_stream 설정할 수 있습니다 친구 또는 멤버를 만들 수 있죠 :
내가 세 가지 문제가?
요약 : 후 친구 대신 전
- 넣어 템플릿을.
- std :: ios :: hex는 조작자가 아닙니다. std :: hex는 조작자입니다.
최종 결과 (... 세 개의 점으로) 그에게 printf와 방법을하고 다중 매개 변수 방법을 사용하지 왜
#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;
};
최종 결과가 잘못되었습니다. 클래스 범위의 특수화는 허용되지 않습니다. 대신에 오버로드됩니다 (템플릿 <> 부분 생략). 그렇지 않으면 (다음 일반 연산자 기능) 친구가 아니기 때문에 Adam의 대답 (네임 스페이스 범위에서 특수화)에서 필요합니다. –
흥미롭게도, 그들은 거기에서 그들과 함께 일했습니다. 하지만, 정확하기 위해서, 어쨌든 그들을 제거했습니다. 감사! –