c++ - 知道将哪个 ostream 传递给函数 c++
问题描述
我正在编写一个函数,如果它通过文件流与通过控制台输出,它应该以不同的方式处理输出。我可以编写两个函数,一个用于处理 cout,一个用于处理 fstream,并将它们放入 if 语句中以确定调用哪个,或者可以在运行哪个版本上添加一个布尔值,但验证会更简单在我看来,输出传递给函数。我的第一次尝试是
void print(unsigned long long exp, unsigned long long* total,
ostream& out, unsigned long long min, unsigned long long max, unsigned
long long length)
{
if (out == cout)
...
}
有没有办法重载 == 来比较这些或比较这些的函数?
解决方案
根据您的评论,这是一个 XY 问题——您确实有一个完全不同的问题(当输出到控制台而不是文件时,输出具有特殊格式),并且认为最好通过识别 ostream 来完成。
更好的方法是分配一个自定义格式标志供您使用,然后在 cout.xml 中设置该标志。然后您的打印例程检查标志:
class CustomFlag {
static int flag_id = -1;
public:
static std::ios_base &set(std::ios_base &s) {
if (flag_id < 0) flag_id = s.xalloc();
s.iword(flag_id) = 1;
return s; }
static std::ios_base &clear(std::ios_base &s) {
if (flag_id < 0) flag_id = s.xalloc();
s.iword(flag_id) = 0;
return s; }
static int get(std::ios_base &s) {
if (flag_id < 0) flag_id = s.xalloc();
return s.iword(flag_id); }
};
您std::cout << CustomFlag::set;
可以在标准输出上设置它,并使用它CustomFlag::get(stream)
来检查任何 ostream 上的标志。
通过这种方式,您可以控制任何 ostream 上的格式 - 包括将“控制台”格式设置为文件(用于测试)。如果您调用,它也将在流之间正确复制copyfmt
推荐阅读
- joomla3.0 - 谷歌搜索控制台两个问题移动技术可点击元素靠得太近和内容比屏幕宽
- cypress - Cypress cy.visit 导致 401 未授权
- php - 并非所有键都散列到标记键的同一插槽,如何解决此问题
- django - Django Rest Framework 中的 NameError,它显示我的模型名称未定义
- javascript - 获取表格单元格数据
- performance - 有没有办法找出或控制 Elixir 中哪个 CPU 内核上运行的进程?
- google-cloud-platform - 当自定义日志消息传送到 GCP Stackdriver 时发送通知
- javascript - 如何通过表单提交保持 Chrome 扩展在页面重新加载时运行?
- r - 闪亮的 fileInput() 对多个文件选择没有反应
- android - Android导航组件:以编程方式从与家不同的目的地开始?