Здравствуйте, Andrew S, Вы писали:
...
J>>Так что правильный путь, имхо — это дать возможность пользователю самому решить, что ему нужно, например, как делает boost.asio (можно и по-другому делать).
AS>Но, имхо, не для каждого интерфейса. Либо делать 2 разных интерфейса с возможность move-upgrade одного в другой...
AS>Вот этого бы не хотелось, на самом деле.
Если модификация api невозможна, то можно такие варианты рассмотреть:
// Дано:
result api::f1(); // все nothrow
result api::f2();
result api::f3();
// использование
checked_result r(error_code1 | error_code2);
r = api::f1();
r = api::f2();
r = api::f3();
Объект checked_result в операторе присваивания проверяет аргумент на присутствие error_code1 или error_code2, и в случае обнаружения кидает исключение. Либо просто использует что-то вроде 'if(FAILED(hr)) throw ...'.
Другой вариант — опять nothrow api, + легкие обертки-функторы:
remove_file remove(std::nothrow); // любые ошибки игнорируются
std::for_each(v.begin(), v.end(), remove);
//...
// not_found трансформируется в исключение,
// остальные ошибки просто возвращаются.
remove_file remove(not_found);
result r = remove(filename);
if(r == access_denied)
{
//...
}