为什么要在函数中传递 input/output 流?

Why pass input/output stream in a function?

我们为什么要这样做:

#include <iostream>

void print(std::ostream& os) {
  os << "Hi";
}

int main() {
  print(std::cout);
  return 0;
}

而不是这个:

#include <iostream>

void print() {
  std::cout << "Hi";
}

int main() {
  print();
  return 0;
}

是否有某些只有第一个版本才能获得的优势或功能?

是的,第一个版本明显更好。就像评论中已经提到的那样,它允许您使用任何类型的 std::ostream,而不仅仅是 std::cout。这种架构选择的一些最重要的后果是:

  1. 您可以使用您的函数将所需数据打印到标准输出、文件、同事编写的自定义class(例如数据库适配器、记录器)。

  2. 可以测试您的 void print 功能。例如:

TEST(MyFunctionShould, printHello)
{
  std::string expectedResult("Hello");
  std::ostringstream oss;
  print(oss);
  ASSERT_EQ(expectedResult, oss.str());
}