我有以下形式的序列号类:
class SerialNumber { ... }
我想operator>>
为它写:
istream& operator>>(istream& i, SerialNumber& s)
{
???
return i;
}
序列号的长度始终为 19 个字符,并以十六进制数字开头。
如果我应该istream.read
19 个字符,我很困惑。它可能包括前缀空格。?
或者我是否应该阅读 ai >> std::string
然后检查它是否有 19 个字符长。当您阅读 astd::string
时,它会跳过空格(是否有标准的方法来实现?)此外,如果我阅读 astd::string
它可能有一个有效的 19 个字符的序列号前缀,我可能会“过度阅读”输入。?
更新:
inline istream& operator>>(istream& is, SerialNumber& id)
{
ostringstream os;
is >> ws;
for (int i = 0; i < 19; i++)
{
char c;
is >> c;
os << c;
}
id = DecodeId(os.str());
return is;
}
Dietmar Kühl 代码的部分净化版本:
istream& operator>> (istream& in, SerialNumber& sn)
{
constexpr size_t n = 19;
istream::sentry se(in);
if (!se)
return in;
istreambuf_iterator<char> it(in.rdbuf()), end;
if (it == end || !isxdigit(*it))
{
in.setstate(ios_base::failbit);
return in;
}
string s(n,'?');
for (size_t i = 0; it != end && i < n && !isspace(char(*it)), ++i)
s[i] = *it++;
sn = DecodeId(s);
if (failed to decode)
in.setstate(ios_base::failbit);
return in;
}