我想一个通用的,完全符合istream的“提取运算符”是这样的:如何实现运算符>>(std :: istream&,std :: array <char, N>&)?
template <typename CharT, size_t N, class Traits>
std::basic_istream<CharT, Traits>& operator>>(
std::basic_istream<CharT, Traits>& in,
std::array<CharT, N>& out)
{
std::basic_string<CharT, Traits> buf; // this is not great
in >> buf;
if (buf.size() >= N) {
in.setstate(std::ios::failbit); // is this the right thing to do?
out[0] = 0;
} else {
std::copy(buf.begin(), buf.end(), out.data());
out[buf.size()] = 0;
}
return in;
}
但这种分配并复制内存不必要。我想避免这种情况。但我也想保留完整的功能,包括适当的空格和对std::noskipws
等的支持等。如果使用Boost更简单,则可以使用Boost。
我相信你肯定发现了一次只读一个字符的方法有问题,然后保持计数以检查溢出。 – Arunmu
@JohnZwinck我想你应该用一些边缘案例来说明你想要的确切行为,例如''a b c“','”abc“'。 – Holt
@Holt:我想要的行为与使用'std :: string'而不是'std :: array'完全相同的行为,如果字符串不适合内部N包括空终止符,那么添加一个设置失败。其余的行为和所有的边缘情况应该像普通的C++字符串一样处理。 –