我正在尝试进行简单的比较,以确定istream是std :: cin还是std :: ifstream。
我的伪代码是这样的:
class myclass
{
public:
void write(istream& is)
{
if(is == cin) // this does not work
{
//do something
}
else
{
//do something else
}
}
};
我该怎么办?
谢谢!
答案 0 :(得分:2)
由于std::cin
是std::istream
的实例,您可以比较两个对象的地址,看它们是否相等:
if (&is == &std::cin)
(Demo)
但是我会考虑调查你是否可以在不这样做的情况下实现目标;基于流参数的身份的切换逻辑不是很干净,可能会阻碍该项目的未来开发或维护。
答案 1 :(得分:0)
我不确定您为什么需要检查是否有cin,但我遇到了同样的问题,原因是:如果我有cin,则表示我处于交互模式,因此我应该给一些提示有用的信息。虽然希望用cin检查cin的地址始终可以正常工作,但我真的不相信它...
无论如何,我的解决方案是略微概括并添加具有合理默认值的额外参数
void f(istream &i, ostream *o = nullptr) {
if (o) {
*o << "useful info...";
}
i >> important_variable;
}
使用“指向参数的指针意味着可选参数”的惯用语,它提供了更为通用的功能。如果由于其他原因需要cin,则还可以专门研究所需的cin属性,以及如何确定输入流是否拥有它们。