根据特定的程序条件,我如何将std::ostream
绑定到std::cout
或std::ofstream
对象?虽然有很多原因无效,我想实现的东西,是语义上等效于以下内容:从std :: cout或std :: ofstream(文件)获取std :: ostream
std::ostream out = condition ? &std::cout : std::ofstream(filename);
我见过一些例子,不是异常安全的,比如一个来自http://www2.roguewave.com/support/docs/sourcepro/edition9/html/stdlibug/34-2.html:
int main(int argc, char *argv[])
{
std::ostream* fp; //1
if (argc > 1)
fp = new std::ofstream(argv[1]); //2
else
fp = &std::cout //3
*fp << "Hello world!" << std::endl; //4
if (fp!=&std::cout)
delete fp;
}
有谁知道更好的例外安全解决方案吗?
这似乎并不比任何更多的异常安全原始代码。 – Brian 2008-12-22 20:46:20
是的。如果在处理(* fp <<“Hello World”<< std :: endl)时引发异常,则原始代码会发生内存泄漏。 – Tom 2008-12-23 03:58:42
为什么这个答案得到我的投票是第一个答案打破了我的旧规则“不要惹别人的内部物体”。只是因为你**可以**取代rdbuf并不意味着你应该。 – 2011-02-28 11:06:50