检查ostream对象是cout还是ofstream,c ++

Jor*_*dan 8 c++ cout ofstream ostream

在C++中有没有办法检查ostream对象是对象cout还是ofstream对象?

就像是:

ostream& output(ostream& out)
{
    if (out == cout)
        return out;
    else
    {
        out << "something different because its not going to the console" << endl;
        return out;
    }
}

我想这样做的原因是,我想重载<<运算符以执行两个不同的操作,具体取决于它使用的流类型.

是否有可能<<每次使用不同类型的流重载操作员两次?

更新以更好地反映意图.

seh*_*ehe 10

通过检查streambuffer身份,你一定会更进一步

if (s.rdbuf() == std::cout.rdbuf())
Run Code Online (Sandbox Code Playgroud)

这是因为将流交叉分配/别名到缓冲区非常简单,请参阅http://www.cplusplus.com/reference/iostream/ios/rdbuf/和Josuttis的书


fra*_*nkc 5

听起来您真正想知道的不是流是否是 cout 而是底层文件描述符是否附加到终端?如果是这样,您需要底层文件描述符。不幸的是,您无法从 iostream 中获得它。如果可以使用 cstdio 而不是 iostream,那么您可以。如果您确实有文件描述符,那么确定您是否正在写入终端很简单,就像查看 tcgetattr() 是否返回 -1 一样。

另外,不要让任何人告诉您不要实现您需要的某些功能,因为它会玷污某些泄漏抽象的纯度。如果你真的需要不同的行为,那么做你需要做的事情来产生那个功能。


xto*_*ofl 4

可以通过检查流的“身份”来实现if ( &out == &cout ) ...

但是,我对这个测试的实用性表示怀疑。如果您的函数可以处理任何输出流,为什么还要关心它使用的是什么流呢?

  • 为什么?也许,将一件事写入文件,并将另一件事写入终端。例如,在写入终端时使用转义序列对输出进行着色。但如果 STDOUT 被重定向,它就不起作用。 (14认同)