Мой вопрос: Каков правильный способ создания экземпляров std::error_code из errno значений в POSIX и GetLastError() в Windows, чтобы экземпляры можно было сравнить с известными значениями из std::errc?
Более длинное объяснение. Моя цель - добавить экземпляр std::error_code к самодельному объекту исключения, который работает в системах POSIX и Windows с использованием С++ 11ish.
В моем кросс-платформенном приложении я использую самодельную иерархию классов ввода-вывода, которая использует вызовы POSIX fopen() и Windows 'CreateFile() для открытия/создания файлов. Если это не удается, генерируется генерированное исключение типа open_error (оно получено из std::exception, да, но это не один из предопределенных классов исключений С++). Я пытаюсь расширить это исключение с помощью bare-bones с кодом ошибки; точнее, с С++ 11 std::error_code, если я правильно понял.
Моя проблема заключается в том, как построить такой объект из 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, но я спрашиваю о реализации std, а не о Boost's.
Пожалуйста, не советуйте переключаться на использование потоков С++ для доступа к файлам. Я бы с удовольствием, но рефакторинг половины моего кода - это не то, что я хотел бы сделать прямо сейчас.