我需要一个C ++函数将一些文本数据(多行)转储到控制台:
void DumpData() const
{
std::cout << "My Data 1" << std::endl;
std::cout << "My Data 2" << std::endl;
}
这应该是默认行为,但是,还必须能够传递一些其他流对象而不是std::cout
,如下所示:
void DumpData(std::ostream& Stream = std::cout) const
{
Stream << "My Data 1" << std::endl;
Stream << "My Data 2" << std::endl;
}
现在回答我的问题:
std::ostream&
)?= std::cout
吗?此外(3.),在调用此函数后,如果我传递自己的流对象,我需要逐行遍历此流中的所有字符串。实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
1和2是正确的。您的另一个选择是使用std::ostringstream
,但由于std::cout
是std::ostream
,您需要使用此签名定义另一个函数。
要迭代自定义输出,我会convert the stream to a string,然后使用某种字符串拆分来读取每一行。
答案 1 :(得分:1)
你为什么不亲自尝试一下?
以下是std::cout
和std::stringstream
的代码in Coliru作为示例(const
明显删除了DumpData
:
#include <iostream>
#include <sstream>
void DumpData(std::ostream& Stream = std::cout)
{
Stream << "My Data 1" << std::endl;
Stream << "My Data 2" << std::endl;
}
int main() {
DumpData();
std::stringstream ss;
DumpData(ss);
std::string l;
while(std::getline(ss, l)) {
std::cout << l << std::endl;
}
return 0;
}
输出符合您的预期。
答案 2 :(得分:0)
添加到@Jay的答案,您可以使用模板参数,以便能够使用各种流,例如std::stringstream
或std::iostream
,只要模板参数支持{{ 1}} operator。
<<
通过确保提供的类型T超载运算符template <typename T> // = decltype(something)
void DumpData(T& Stream = std::cout) const
{
Stream << "My Data 1" << std::endl;
Stream << "My Data 2" << std::endl;
}
,您可以更进一步。
同样在某些情况下,某些(可能是自定义的)流可能无法支持<<
,因此默认使用std::endl
可能更安全,因为它可以避免不必要的刷新,因此总是更好。{ / p>