首页 > 解决方案 > 设置流状态以在格式化输出运算符(运算符<<)中传达错误

问题描述

我相信当给定输入不可用时,在输入流上设置故障位是最佳实践。但是我想知道为什么我没有找到证据在 ostreams 上做同样的事情。

例如, cppreference具有以下用于重载运算符 << 和 >> 的示例。

std::ostream& operator<<(std::ostream& os, const T& obj)
{
    // write obj to stream
    return os;
}
std::istream& operator>>(std::istream& is, T& obj)
{
    // read obj from stream
    if( /* T could not be constructed */ )
        is.setstate(std::ios::failbit);
    return is;
}

问题:我想知道是否还应该在输出流上设置故障位(如果适用)。

请考虑以下示例:

enum class enumeration
{
    ONE,
    TWO
};

std::ostream& operator<<(std::ostream& os, const enumeration& e)
{
    switch (e)
    {
        case enumeration::ONE:
            os << "1";
            break;
        case enumeration::TWO:
            os << "2";
            break;
        default: 
            os.setstate(std::ios::failbit); // <-- line in question
            break;
    }
    return os;
}

有问题的线路是否合理?(我在这里放了一个工作示例cpp.sh。)

最后,我想知道我是否可以、应该或避免在 ostreams 上设置故障位以及为什么。

标签: c++operatorsoutputstream

解决方案


您所描述的情况的标准做法是编写一些无效值的表示。通常不需要将其标记为错误。例如,如果出现数值 42,您可以写“? (42)”。或者也许只是“42”,如果您希望能够轻松地使用operator >>.


推荐阅读