如何“parametri化”输出流?

How to "parametrize" an output stream?

提问人:Pietro 提问时间:1/27/2017 更新时间:1/27/2017 访问量:91

问:

我怎样才能使这个伪代码工作?

std::ostream  ostr;
std::ofstream ofstr;

if(condition) {
    ostr = std::cout;
}
else {
    ofstr.open("file.txt");
    ostr = ofstr;
}

ostr << "Hello" << std::endl;

这不会编译,因为没有公共默认构造函数。std::ostream

C++ IOSTREAM Fstream Ostream

评论

0赞 Useless 1/27/2017
链接的问题不是完全重复的,但它足够接近,并且接受的答案显示了您的问题的解决方案。
1赞 Jarod42 1/27/2017
在您的情况下,您可以使用三元运算符:std::ostream& ostr = (condition ? std::cout : (ofstr.open("file.txt"), ofstr));
0赞 Pietro 1/27/2017
@Jarod42:刚刚尝试过;它在 true 时起作用,我在 cout 上得到输出,但在 false 时没有写入文件。conditioncondition
0赞 Jarod42 1/27/2017
演示
0赞 Pietro 1/27/2017
要同时将数据发送到多个流,请执行以下操作: http://stackoverflow.com/questions/1760726/how-can-i-compose-output-streams-so-output-goes-multiple-places-at-once

答:

1赞 Jarod42 1/27/2017 #1

在您的情况下,您可以使用三元运算符:

std::ostream& ostr = (condition ?
                      std::cout :
                      (ofstr.open("file.txt"), ofstr)); // Comma operator also used
                                                        // To allow fstream initialization.
0赞 Pietro 1/27/2017 #2

此实现可以切换到其他流:

std::ofstream ofstr;
std::ostream *ostr;

ofstr.open("file.txt");

ostr = &ofstr;
*ostr << "test --> file\n" << std::endl;

ostr = &std::cout;
*ostr << "test --> stdout\n" << std::endl;