私はこのような一般的な、完全に準拠した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を使用すると、はるかに簡単であれば問題ありません。このような
一度に1文字ずつ読むだけでなく、オーバーフローをチェックするためにカウントを維持するという方法で問題があることがわかったはずです。 – Arunmu
@JohnZwinck私は、あなたが望む正確な振る舞いをいくつかの例を挙げて指定するべきだと思います。 '' a b c "'、 '' abc ''です。 – Holt
@Holt: 'std :: array'の代わりに 'std :: string'を使用した場合とまったく同じ動作が必要です。文字列がヌルターミネータを含めてNの内側に収まらない場合は、設定の失敗が追加されます。残りの動作とすべてのエッジケースは、通常のC++文字列と同じように処理する必要があります。 –