【发布时间】:2017-05-31 02:58:23
【问题描述】:
我想要一个通用的、完全兼容的 istream “提取运算符”,如下所示:
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 更容易的话,就可以了。
【问题讨论】:
-
我相信您一定已经发现了一些问题,即一次只读取单个字符然后保持计数以检查溢出的方法。
-
@JohnZwinck 我认为您应该使用一些极端情况示例指定您想要的确切行为,例如
" a b c"," abc ". -
@Holt:我想要与使用
std::string而不是std::array<char, N>完全相同的行为,如果字符串不适合包含空终止符的N,则添加一个设置失败。其余的行为和所有边缘情况都应该像普通的 C++ 字符串一样处理。
标签: c++ operator-overloading iostream istream