11

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;
    }
}

我想这样做的原因是,我想重载<<运算符以根据使用的流类型来做两件不同的事情。

是否可以<<每次使用不同类型的流重载运算符两次?

更新以更好地反映意图。

4

4 回答 4

14

通过检查流缓冲区标识,您肯定会走得更远

if (s.rdbuf() == std::cout.rdbuf())

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

于 2011-03-13T23:03:16.827 回答
6

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

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

于 2010-07-23T15:44:08.817 回答
4

可以通过检查流的 'identity': if ( &out == &cout ) ...

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

于 2010-07-23T13:58:23.363 回答
1

我认为根据要流式传输的对象更改流式传输的方式是一个可怕的想法,它完全忽略了流对象的工作方式的全部意义。因此,我将创建一个成员类或函数,它返回一个以不同方式处理流的类型的对象。因此,例如,如果您想提供彩色流,您可以调用:

std::cout << myclass.colorstreamer << endl;

编辑:

您处理流的建议是一个坏主意,因为您不知道其他人将如何使用您的代码。根据正在执行流式传输的对象,流的行为不同是完全不直观的。我把这比作一个函数,它根据谁调用它而不是取决于它的参数是什么返回不同的结果,尽管我承认从技术上讲流是一个参数。

至于如何做到这一点,一种方法是创建一个colorstreamer,使这个新类成为 的成员myclass并使其myclass成为 的成员colorstreamer,然后使colorstreamer的流操作符成为 的朋友myclass。我更担心调用函数的语义(即.colorstreamer用于控制它的流式传输方式而不是使用流本身),而不是如何实现它。我对如何实现它的建议很可能是一个不好的方法;我的 C++ 生锈了。

于 2010-07-23T14:33:34.497 回答