달성하려는 목표는 무엇입니까?출력 스트림 체인이 종료되었는지 확인하는 방법은 무엇입니까?
스트림 체인이 종료되었는지 어떻게 알 수 있습니까? 아래의 기능 (모든 기능이 질문에 LogRouter 클래스 안에있는) 봐 : 나는 위의하지만 사용하여 스트림에서 동일한 기능을 수행 할
template<typename First, typename... Rest>
void log(const LogLevel &level_, First first_, Rest... rest_) {
sstream << first_ << " ";
log(level_, rest_...);
}
void log(const LogLevel &level_) {
for(auto &route : routes)
route->stream() << sstream.str() << std::endl;
sstream.clear();
sstream.str("");
}
. 내가 스트림의 끝에 도달 할 때,이 경로에 대신
router.log(LogLevel::Alert, "test stream", 15);
은 내가 시도 무엇
router.log(LogLevel::Alert) << "test stream " << 15;
를 사용할 수 있도록하려면 사용하는 최종 데이터를 보낼 필요 :
std::ostream
연산자 오버로딩 포장 된 변수를 허용하지 않습니다.매 하나의 전달 된 값을 하나씩 통과합니다. 아래처럼이 나를 제공
struct LogEnd {}; static LogEnd end() { return LogEnd; } template<typename T> LogRouter &operator<<(const T &value) { sstream << value; return *this; } LogRouter &log(const LogLevel &level_) { currentLogLevel = level_; //had to add another variable return *this; } void operator<<(const LogEnd &end) { for(auto &route : routes) route.stream() << sstream.str() << std::endl; currentLogLevel = LogLevel::None; }
나는 현명한 구문 원하지만 내가 모든 말에 추가
LogRouter::end()
를 호출 할 필요 :router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end();
나는 또한
std::endl
에 대한 구문을 가지고 있지만 것 최후에 아무 것도하지 않고 전화 할 수 있다면 가장 좋습니다.
질문
는 스트림 체인의 끝을 알 수있는 방법이있다. 재귀 가변적 템플릿 함수를 사용할 때 할 수있는 것과 비슷한 점.
개인용 가상'std :: stringbuf'를 파생시키는 이유를 분명히 해 줄 수 있습니까? – Gasim
이것은 멋진 소형 솔루션이지만 어떻게 컴파일합니까? 나는 g ++ 4.8로 노력 중이며 많은 오류가 있습니다. – Bogatyr
@Bogatyr : 우선, 지원되는 rvalue 참조를 얻으려면 C++ 11이 활성화 된 상태 ('-std = C++ 11')로 컴파일해야합니다. 또한 스트림의 구조 이동을 적절하게 지원하는 표준 라이브러리가 있어야합니다. 이것들과 함께, 코드는 그대로 컴파일됩니다. 'libstdC++'가'g ++'4.8을 가지고 배송되면 제대로 구현되었는지 모르겠습니다. 스트림의 이동이 올바르게 지원되지 않는다면'std :: stringbuf'를'std :: unique_ptr'에 집어 넣고 포인터를'std :: stringbuf' 대신에 움직여야 할 수도 있습니다. . –