为什么要在函数中传递 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
。这种架构选择的一些最重要的后果是:
您可以使用您的函数将所需数据打印到标准输出、文件、同事编写的自定义class(例如数据库适配器、记录器)。
可以测试您的 void print
功能。例如:
TEST(MyFunctionShould, printHello)
{
std::string expectedResult("Hello");
std::ostringstream oss;
print(oss);
ASSERT_EQ(expectedResult, oss.str());
}
我们为什么要这样做:
#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
。这种架构选择的一些最重要的后果是:
您可以使用您的函数将所需数据打印到标准输出、文件、同事编写的自定义class(例如数据库适配器、记录器)。
可以测试您的
void print
功能。例如:
TEST(MyFunctionShould, printHello)
{
std::string expectedResult("Hello");
std::ostringstream oss;
print(oss);
ASSERT_EQ(expectedResult, oss.str());
}