C++ 双流

C++ 双流,c++,stream,C++,Stream,我正在使用cerr流作为错误输出,但我还想将任何错误输出保存在内存中的stringstream中 我希望扭转这一局面: stringstream errorString; cerr << " Something went wrong "; errorString << " Something went wrong "; stringstreamerrorstring; cerr覆盖运算符使用。您可以使用 #包括 #包括 #包括 #包括 名称空间io=boost::ios

我正在使用cerr流作为错误输出,但我还想将任何错误输出保存在内存中的stringstream中

我希望扭转这一局面:

stringstream errorString;
cerr << " Something went wrong ";
errorString << " Something went wrong ";
stringstreamerrorstring;
cerr覆盖
运算符使用。

您可以使用

#包括
#包括
#包括
#包括
名称空间io=boost::iostreams;
int main(){
std::stringstream-ss;
io::tee_设备接收器(ss、std::cerr);
io::流(接收器);

stream您需要将
streambuf
子类化,并将
myErr
声明为使用您的子类的
ostream
。使输入函数不执行任何操作,然后将输出函数复制到您需要的任何流


12年前,我有一个类做了类似的事情,但现在已经不知道了。我还没有找到一个好的例子,但可以作为一个起点。关注受保护的输出函数。

你可以创建你的
myErr
类的类型,如下所示:

class stream_fork
{
    std::ostream& _a;
    std::ostream& _b;

public:
    stream_fork( std::ostream& a, std::ostream& b)
        :   _a( a ),
            _b( b )
    {
    }

    template<typename T>
    stream_fork& operator<<( const T& obj )
    {
        _a << obj;
        _b << obj;
        return *this;
    }

    // This lets std::endl work, too!
    stream_fork& operator<<( std::ostream& manip_func( std::ostream& ) )
    {
        _a << manip_func;
        _b << manip_func;
        return *this;
    }
};
class-stream\u-fork
{
标准::奥斯特雷姆和乌阿;
std::ostream&u b;
公众:
溪流叉(标准::奥斯特雷姆&a,标准::奥斯特雷姆&b)
:_a(a),
_b(b)
{
}
模板

stream_fork&Operator简单覆盖无法启用流“堆叠”,我不知道如何重写它来实现这一点。正如@Daniel所说,创建一个类并重写运算符我已经冒昧地更改了代码中的小错误…@Konrad:谢谢。我整天都处于C模式。这只适用于字符串。你需要为你想要输出的每种类型编写一个重写。你愿意吗支持ostreams也支持的每种类型?这是最好的情况,它只是想成为cerr的替代品。但我不确定这会涉及多少工作。就像这样:我正在键入一些关于如何编写自己的tee类的内容。我应该记得boost有一个。愚蠢的工具包。请原谅我的天真,但使用了templating,这一切都必须在头文件中,是吗?(模板总是给我带来问题!)显然不是。幸运的是,这个解决方案不涉及boost(我不允许使用)。模板运算符的实现在以前遇到模板时,我最终会得到函数的多个副本(每个.o文件都有自己的文件或其他文件),但这里似乎没有发生这种情况!
MyErr& operator<< ( MyErr& myErr, std::string message)
{
    cerr << message;
    errorString << message; //Where errorString is a member of the MyErr class

    return myErr;
}
int main()
{
    MyErr myErr;
    myErr << " Something went wrong. ";

    return 0;
}
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#include <iostream>
#include <sstream>

namespace io = boost::iostreams;

int main() {
    std::stringstream ss;
    io::tee_device<decltype(ss), decltype(std::cerr)> sink(ss, std::cerr);
    io::stream<decltype(sink)> stream(sink);
    stream << "foo" << std::endl;
    std::cout << ss.str().length() << std::endl;
    return 0;
}
class stream_fork
{
    std::ostream& _a;
    std::ostream& _b;

public:
    stream_fork( std::ostream& a, std::ostream& b)
        :   _a( a ),
            _b( b )
    {
    }

    template<typename T>
    stream_fork& operator<<( const T& obj )
    {
        _a << obj;
        _b << obj;
        return *this;
    }

    // This lets std::endl work, too!
    stream_fork& operator<<( std::ostream& manip_func( std::ostream& ) )
    {
        _a << manip_func;
        _b << manip_func;
        return *this;
    }
};
stream_fork myErr( std::cerr, errorString );
myErr << "Error Message" << std::endl;