C++:将流中的小数解析为 uint8_t

C++: Parse decimal from stream into uint8_t

有没有一种方法可以直接使用流操作符来执行以下操作?

uint8_t actual;
uint32_t temporary;
std::cin >> std::dec >> temporary;
if (temporary > UINT8_MAX) {
  // error
}
actual = static_cast<uint8_t>(temporary);

特别是,我想将足够小的十进制数解析为 uint8_t,而不求助于更大的临时变量。

您可以直接将输入流式传输到 uint8_t 变量中,如下所示:

uint8_t actual;
std::cin >> std::dec >> actual;

如果您的输入太大,比如说您输入了“12000”,您的 actual 变量将保存 1

的值

不,我认为没有办法用 std::istream 直接将数字读入 unsigned charstd::num_get::get 不支持 unsigned char

你可以把它封装成一个函数:

inline std::uint8_t read_uint8(std::istream& is) {
    unsigned short temporary;
    is >> temporary;
    if (!is) return -1;
    if (temporary > UINT8_MAX) {
        is.setstate(std::ios_base::failbit);
        return -1;
    }
    return std::uint8_t(temporary);
}


int main() {
    std::uint8_t actual = read_uint8(std::cin);
    if (!std::cin) {
        // error
    }
}

或者你可以做类似 std::put_moneystd::osyncstream 的事情,并包装一个参数来调用自定义 operator>>:

struct read_uint8 {
    std::uint8_t& v;
    read_uint8(std::uint8_t& v) : v(v) {}
};

inline std::istream& operator>>(std::istream& is, read_uint8 v) {
    unsigned short temporary;
    is >> temporary;
    if (is) {
        if (temporary > UINT8_MAX) {
            is.setstate(std::ios_base::failbit);
        } else {
            v.v = std::uint8_t(temporary);
        }
    }
    return is;
}

int main() {
    std::uint8_t actual;
    if (!(std::cin >> read_uint8(actual))) {
        // error
    }
}