我想将一个流参数输入到一个方法,该方法可以是<stringstream>
或<iostream>
,如下所示:
void method(? out); // or
void method(? in);
如果?
是<istream>
或<ostream>
,那就很简单了。我不知道的是,如果参数为<istream>
或<stringstream>
或<ostream>
或<stringstream>
,该怎么办。
可以这样做吗?
答案 0 :(得分:1)
实现std::istream
和std::ostream
的流,例如std::stringstream
和std::fstream
来自std::iostream
(因为它们都是类模板,你会在标准中寻找basic_...
。也就是说,如果您确实需要一个用于输入和输出的流,那么您将传递std::iostream&
。
班级std::iostream
来自std::istream
和std::ostream
。适当的类型是直截了当的:
std::istream&
std::ostream&
std::iostream&
(我不认为我曾在生产代码中使用过这个)请注意,在流可能是文件流的情况下,您需要在读取和写入之间进行切换:在读取和写入之间切换而不进行干预寻找,即使搜索到当前位置,也会导致未定义的行为。 / p>
答案 1 :(得分:0)
字符串流类和文件流类都公开派生自一般流基类std::basic_istream<...>
和std::basic_ostream<...>
。这意味着您可以将(例如)std::ostringstream
个对象传递给采用std::ostream
的函数:
void test(std::ostream& os); std::ostringstream buf; test(buf); // Good!
除非您当然需要特定于派生流类的其他功能。例如,字符串流提供str()
方法,文件流提供open()
/ close()
成员函数。在您需要这些的情况下,您可以test()
将字符串流或文件流作为参数。
void test(std::istringstream& iss) { std::cout << iss.str(); // Works because the type is a stringstream }