C++ 如何确定输出流链是否结束?

C++ 如何确定输出流链是否结束?,c++,templates,c++11,stream,C++,Templates,C++11,Stream,我正在努力实现什么? 如何查找流链是否结束?查看下面的函数(在这个问题中,所有这些函数都在LogRouter类中): 我希望能够使用 router.log(LogLevel::Alert) << "test stream " << 15; 这就提供了我想要的语法,但我需要在每个: router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end(); rou

我正在努力实现什么?

如何查找流链是否结束?查看下面的函数(在这个问题中,所有这些函数都在LogRouter类中):

我希望能够使用

router.log(LogLevel::Alert) << "test stream " << 15;
这就提供了我想要的语法,但我需要在每个:

 router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end();

router.log(LogLevel::Alert)您可以将有趣的逻辑放入流的析构函数中。显然,我也会正确地处理流,而不是炮制一些看起来像流但实际上不是流的东西:

#include <iostream>
#include <sstream>
#include <string>

class logstream
    : private virtual std::stringbuf
    , public std::ostream {
    std::string level;
public:
    logstream(std::string l)
        : std::ostream(this)
        , level(l) {
    }
    logstream(logstream&& other)
    : std::stringbuf(std::move(other))
    , std::ostream(std::move(other))
    , level(std::move(other.level)) {
        this->rdbuf(0);
    }
    ~logstream() {
        std::cout << "do something interesting here("
                  << this->level<< ", " << this->str() << ")\n";
    }
};

logstream trace() {
    return logstream("trace");
}

int main()
{
    trace() << "hello, world";
}
#包括
#包括
#包括
类日志流
:私有虚拟标准::stringbuf
,公共标准::ostream{
std::字符串级别;
公众:
日志流(标准::字符串l)
:std::ostream(此)
,第(1)级{
}
日志流(日志流和其他)
:std::stringbuf(std::move(其他))
,std::ostream(std::move(其他))
,级别(标准::移动(其他.级别)){
此->rdbuf(0);
}
~logstream(){

std::能否请您澄清为什么要派生私有虚拟
std::stringbuf
这是一个可爱、紧凑的解决方案,但如何编译它?我正在尝试使用g++4.8,但遇到了大量错误。@Bogatyr:首先,您需要启用C++11(
-std=C++11
)进行编译要获得支持的右值引用,您还需要有一个标准库,该库正确支持流的移动构造。有了这些库,代码可以按原样编译。我不知道
libstdc++
附带的
g++
4.8是否正确实现了这一点。如果流的移动构造不正确支持,您可能需要要将
std::stringbuf
粘贴到
std::unique_ptr
中,并移动指针而不是
std::stringbuf
@DietmarKühl,您使用的编译器是什么?我确实使用-std=c++11进行编译。我将您的代码复制到并选择了c++14(g++4.9.2)我在g++4.8中得到了与-std=c++11相同的错误,它们的开头是:logstream.cpp:17:35:错误:使用删除的函数'std::basic_stringbuf::basic_stringbuf&',level(std::basic_stringbuf&'),level(std::move(other.level))@Bogatyr:我有多个版本的gcc。我可以看到gcc-4.9.2的问题,但gcc-5.1.0没有出现问题:gcc-4.9.2附带的标准库显然没有为流实现移动构造函数。但是,
std::basic_stringbuf
明确指定在C++11中有一个可访问的移动构造函数。
 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;
}
 router.log(LogLevel::Alert) << "test stream " << 15 << LogRouter::end();
#include <iostream>
#include <sstream>
#include <string>

class logstream
    : private virtual std::stringbuf
    , public std::ostream {
    std::string level;
public:
    logstream(std::string l)
        : std::ostream(this)
        , level(l) {
    }
    logstream(logstream&& other)
    : std::stringbuf(std::move(other))
    , std::ostream(std::move(other))
    , level(std::move(other.level)) {
        this->rdbuf(0);
    }
    ~logstream() {
        std::cout << "do something interesting here("
                  << this->level<< ", " << this->str() << ")\n";
    }
};

logstream trace() {
    return logstream("trace");
}

int main()
{
    trace() << "hello, world";
}