C++ iostream和stringstream的方法参数
我想向方法输入一个流参数,该方法可以是C++ iostream和stringstream的方法参数,c++,C++,我想向方法输入一个流参数,该方法可以是或,如下所示: void method(? out); // or void method(? in); 如果?是或则很简单。我不知道的是,如果参数是或,或者是或,该怎么办 可以做到这一点吗?实现std::istream和std::ostream的流,例如std::stringstream和std::fstream派生自std::iostream(因为它们都是类模板,您应该在标准中查找basic.)。也就是说,如果您确实需要一个用于输入和输出的流,您需要
或
,如下所示:
void method(? out); // or
void method(? in);
如果?
是
或
则很简单。我不知道的是,如果参数是
或
,或者是
或
,该怎么办
可以做到这一点吗?实现
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&
请注意,如果流可能是文件流,则在读写之间切换时需要查找:在不干预查找的情况下在读写之间切换,即使查找到当前位置,导致未定义的行为。字符串流类和文件流类都公开派生自通用流基类
std::basic\u istream
和std::basic\u ostream
。这意味着您可以(例如)将std::ostringstream
对象传递给接受std::ostream
的函数:
当然,除非您需要特定于派生流类的附加功能。例如,字符串流提供str()
方法,文件流提供open()
/close()
成员函数。如果需要这些参数,可以使用test()
将字符串流或文件流作为参数
无效测试(标准::istringstream和iss)
{
标准::cout
void test(std::ostream& os);
std::ostringstream buf;
test(buf); // Good!
void test(std::istringstream& iss)
{
std::cout << iss.str(); // Works because the type is a stringstream
}