【发布时间】:2020-12-25 00:17:07
【问题描述】:
我目前有一个函数
int myfun(const int a) {
...
return rval;
}
执行多项操作。
我的意思是根据我可以传递的某些参数来调整它以编写有关其行为的调试信息。
在我想写该信息的情况下,我也想通过ofstream 来使用。
我希望使用 myfun 的应用程序无需修改也能正常工作。
所以我最好改成
int myfun(const int a, ofstream & ofs) {
...
if (!(ofs == NULL)) {
ofs << ...
}
...
if (!(ofs == NULL)) {
ofs << ...
}
return rval;
}
具有类似于&ofs=NULL 的默认值。我知道NULL 不合适。
什么是适当的处理方式?
注意 1: 我可以传递一个带有输出文件名的可选参数,但这不太灵活。
注意 2: 我也可以改成
int myfun(const int a, const bool debug_info, ofstream & ofs) {
...
if (debug_info) {
ofs << ...
}
使用默认值debug_info=false。
我想这仍然需要ofs 的默认值,如上所述。
注意 3:
Default ofstream class argument in function 中接受的答案提出了没有ofs 参数的重载。
就我而言,这可能行不通,因为我的意思是在“ofs=NULL”时不写任何东西。
注意事项 4:
This other answer 显然有效,但对我来说似乎有些做作,我不确定它是否提供与传递 ofs 相同的功能。
相关:
Is there a null std::ostream implementation in C++ or libraries?
【问题讨论】:
-
创建一个抽象的 Logger 类。在一种实现中,您可以写入 ofs,而在另一种实现中,您可以执行其他操作。通过引用将记录器传入 myfun()。
-
@schteppe - 这需要复制
myfun吗?我的意思是修改myfun,应该避免在两个不同的地方这样做。 -
不,myfun 的实现将保持不变。我现在已经在答案中发布了伪代码。
-
你可以使用一个很容易实现的no-op ostream。 stackoverflow.com/questions/11826554/…