iostream和stringstream的方法参数

时间:2014-01-23 22:42:05

标签: c++

我想将一个流参数输入到一个方法,该方法可以是<stringstream><iostream>,如下所示:

void method(? out); // or
void method(? in); 

如果?<istream><ostream>,那就很简单了。我不知道的是,如果参数为<istream><stringstream><ostream><stringstream>,该怎么办。

可以这样做吗?

2 个答案:

答案 0 :(得分:1)

实现std::istreamstd::ostream的流,例如std::stringstreamstd::fstream来自std::iostream(因为它们都是类模板,你会在标准中寻找basic_...。也就是说,如果您确实需要一个用于输入和输出的流,那么您将传递std::iostream&

班级std::iostream来自std::istreamstd::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
}