+-
c-从std :: stringstream读取uint8_t作为数字类型
我的理解是,从字符串流读取uint8_t是一个问题,因为字符串流会将uint8_t解释为char.我想知道如何从字符串流中读取uint8_t作为数字类型.例如,以下代码:

#include <iostream>
#include <sstream>

using namespace std;

int main()
{
    uint8_t ui;
    std::stringstream ss("46");
    ss >> ui;
    cout << unsigned(ui);
    return 0;
}

打印出52.我希望它打印出46.

编辑:一种替代方法是只从stringstream中读取一个字符串,然后将解决方案转换为uint8_t,但这会破坏不错的链接属性.例如,在我必须编写的实际代码中,我经常需要这样的东西:

   void foobar(std::istream & istream){
       uint8_t a,b,c;
       istream >> a >> b >> c;
       // TODO...
   }
最佳答案
您可以重载输入运算符>>用于uint8_t,例如:

std::stringstream& operator>>(std::stringstream& str, uint8_t& num) {
   uint16_t temp;
   str >> temp;
   /* constexpr */ auto max = std::numeric_limits<uint8_t>::max();
   num = std::min(temp, (uint16_t)max);
   if (temp > max) str.setstate(std::ios::failbit);
   return str;
}

现场演示:https://wandbox.org/permlink/cVjLXJk11Gigf5QE

说实话,我不确定这样的解决方案是否没有问题.更有经验的人可能会澄清.

UPDATE

注意,该解决方案通常不适用于std :: basic_istream(以及它的实例std :: istream),因为存在重载的运算符>对于未签名的char:[istream.extractors].然后,行为将取决于如何实现uint8_t.

点击查看更多相关文章

转载注明原文:c-从std :: stringstream读取uint8_t作为数字类型 - 乐贴网