私の質問:POSIXとWindowsの値std::error_code
からインスタンスを構築して、インスタンスをからの既知の値と比較できるようにする正しい方法は何ですか?errno
GetLastError()
std::errc
より長い説明:私の目標は、std::error_code
POSIXおよびWindowsシステムでC++11のように機能する自作の例外オブジェクトにインスタンスを追加することです。
私のクロスプラットフォームアプリケーションでは、ファイルを開く/作成するためにPOSIXfopen()
とWindowsの呼び出しを使用する自作のI/Oクラス階層を使用しています。CreateFile()
それが失敗した場合、一般的な自作のopen_error
例外がスローされます(これは、はいから派生していstd::exception
ますが、C ++の事前定義された例外クラスの1つではありません)。私はこのやや最低限の例外をエラーコードで拡張しようとしています。std::error_code
私が正しく理解していれば、C++11でより正確になります。
私の問題は、errno
(POSIXの場合)またはGetLastError()
(Windowsの場合)からそのようなオブジェクトを構築する方法です。POSIXの場合、私が理解している限り、のコンストラクターで単純に使用できます。たとえば、次のようにerrno
なります。std::error_code
std::error_code ec(errno, std::generic_category());
そして、それec
はからのよく知られた値に匹敵するはずですstd::errc
。
もちろん、Windowsの場合も同様の呼び出しを行うことができます。
std::error_code ec(::GetLastError(), std::generic_category());
GetLastError()
しかし、によって返される値がからのよく知られた定数にうまくマップされているかどうかはわかりませんstd::errc
。BoostのシステムライブラリでBoostの実装についてerror_code
読んだことがありますが、Boostの実装ではなく、実装について質問していstd
ます。
ファイルアクセスにC++ストリームの使用に切り替えることはお勧めしません。やりたいのですが、コードの半分をリファクタリングすることは、現時点でやりたいことではありません。