C++17のドラフトには、現在までに、iostreamへの変更点として、以下のような変更が加えられている。
P0004R1.HTML#0: Remove Deprecated iostreams aliases
C++98の時点でdeprecated扱いだった一部のメンバーが、とうとう削除された。最初の正式なC++規格の時点ですでにdeprecated扱いだったライブラリが、ようやく削除されたことになる。
ios_baseからは、以下のメンバーが削除された。
class ios_base {
public:
typedef T1 io_state;
typedef T2 open_mode;
typedef T3 seek_dir;
typedef implementation-defined streamoff;
typedef implementation-defined streampos;
};
basic_streambufからは、stosscが削除された。これは以下のように実装できる。
template<class charT, class traits = char_traits<charT> >
class basic_streambuf {
public:
void stossc() { sbumpc() ; }
};
その効果は、ストリームの場所を一つすすめるというものだ。
他にも、実装が自明すぎて意味のないメンバー、重複するメンバーがいくつか削除された。たとえば、basic_iosからはclear。basic_streambufからはpubseekoff, pubseekpos。basic_filebuf/basic_ifstream/basic_ofstreamからはchar const *を引数に取るopenが削除された。
N3654: "quoted" proposal
iostreamにquotedマニピュレーターが入った。サンプルコードを引用すると以下の通り。
std::stringstream ss;
std::string original = "foolish me";
std::string round_trip;
ss << original;
ss >> round_trip;
std::cout << original; // outputs: foolish me
std::cout << round_trip; // outputs: foolish
assert(original == round_trip); // assert will fire
iostreamでは空白文字で入力が区切られてしまうので、空白を含む文字列を入力した良い場合に問題になる。これに対処するために、デリミタ文字にはバックスラッシュを付与して出力し、入力にあたってはバックスラッシュを取り除く処理をする、quoted manipulatorを追加する。これにより、以下のようにかける。
std::stringstream ss;
std::string original = "foolish me";
std::string round_trip;
ss << quoted(original);
ss >> quoted(round_trip);
std::cout << original; // outputs: foolish me
std::cout << round_trip; // outputs: foolish me
assert(original == round_trip); // assert will not fire
ドワンゴ広告
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0
3 comments:
quotedは待ってました。自前で実装するとめんどくさいので入ってよかったです。
空白を含む文字列を入力した"良い"場合に問題になる。
->したい場合?
「char const *を引数に取るopenが削除された」ではなく、open_modeが削除されることことに伴い、「open_modeを引数に取るopenが削除された」のではないでしょうか。
Post a Comment