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