我能做到
std::ostream& out = condition ? std::cout : std::ofstream(filename);
但如果out = std::ofstream(filename)
?
答案 0 :(得分:4)
忘记关闭一段时间,你的代码:
std::ostream& out = condition ? std::cout : of.open(filename);
不会编译开始。 std::ofstream::open()
不返回流 - 它返回void
。您可以将其修复为:
std::ostream& out = condition ? std::cout : (of.open(filename), of);
现在回到关闭流,好吧,你不必,因为当流对象超出范围时(即析构函数被调用时),析构函数将关闭文件流。所以它会自动完成 - 好吧,在99.99%的情况下,除非你做了一些不寻常的事情,在这种情况下你要明确地关闭它!
答案 1 :(得分:4)
据我所知,您希望使用out
关闭文件流?
您不需要明确关闭它。 std::fstream
是RAII对象,因此它将在封闭范围的末尾自动关闭打开的文件。
当然,如果你真的需要立即关闭文件,你总是可以投射out
:
if( ptr = dynamic_cast<std::ofstream*>(out) ) {
ptr->close();
}