【C++17】filesystemについて一つ…

アバター
tk-xleader
記事: 158
登録日時: 14年前
連絡を取る:

【C++17】filesystemについて一つ…

投稿記事 by tk-xleader » 9年前

 Filesystem library - cppreference.com

 C++の次期規格であるC++1zでは、boost.filesystemライブラリをベースとしたライブラリが標準ライブラリに加わる見込みとなっています。Visual C++ 2015では既にヘッダと実装も用意されていたりします。

 ところで、boost.filesystemライブラリとは異なる点もあります。その1つがpathクラスにoperator string_type()が定義されていることですね。これによって、path::string_typeを要求する文脈で明示的に変換する必要がなくなります。
 一方で、boost側はこの変換関数を用意していません。path::native関数によって明示的に変換することを前提にしているのだろうと思われます。ただし、pathを受け取るよう拡張したfstreamが用意されているので、pathのオブジェクトが指し示すファイルをfstreamで読み書きするということに関しては明示的な変換をする必要がありません。C++11ではstd::fstreamがコンストラクタとopen関数でstd::stringを引数に取ってくれるようになったので、これへの変換関数があればboostと同じような使い勝手でpathクラスを使うことができるんですね。

 ただ一つ気を付けなければならないのは、C++1zのドラフトでは、std::fstream系でファイルを開くときのファイル名はconst std::string&/const char* でなければなりませんが、path::string_typeはstd::stringとは限りません。ということは、pathクラスのオブジェクトをstd::fstreamに暗黙変換して渡すと、コードの移植性がちょっと怪しくなります。実際、Visual C++の実装ではpath::string_typeはstd::basic_string(std::wstring)のtypedefなので、標準通りではstd::fstreamには暗黙変換で渡すことはできません。

 とはいうものの、Visual C++では独自拡張としてファイル名をconst std::wstring&/const wchar_t* を受け取るコンストラクタとopenメンバ関数をオーバーロードしてるので、やはりpathクラスのオブジェクトをファイル名として暗黙変換で渡すことが可能です。他の実装、例えばGCCとかではどうなるのかは分かりませんが。

コメントはまだありません。