C ++如何区分std :: cin到std :: ifstream?

时间:2014-10-14 22:52:52

标签: c++ ifstream cin difference

我正在尝试进行简单的比较,以确定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
        }
    }     
};

我该怎么办?

谢谢!

2 个答案:

答案 0 :(得分:2)

由于std::cinstd::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属性,以及如何确定输入流是否拥有它们。