Как принято работать с кодами ошибок C API в C++?
У меня есть такой код, но по нему несколько вопросов
//R — тип результата функции которая может вернуть ошибку
template<typename R>
class is_minus_one{
public:
bool operator()(const R& val){
return val == -1;
}
};
//FailPolicy — функтор для проверки является ли результат выполнения функции ошибкой
template<template<class> typename FailPolicy>
class ExceptionWrapper{
public:
template<typename R, typename... ArgsT>
static auto wrap(R (*func)(ArgsT...)){
return [func](ArgsT... args){
FailPolicy<R> isFail;
R res = func(args...);
if(!isFail(res))
return res;
else {
throw std::system_error(errno, std::system_category());
}
};
}
};
using std_ex = ExceptionWrapper<is_minus_one>;
#define EX_WRAP(func) const static auto ex_##func = std_ex::wrap(func)
//Использование
EX_WRAP(epoll_create1);
EX_WRAP(close);
EX_WRAP(epoll_wait);
EX_WRAP(epoll_ctl);
- Как избежать копирования аргументов?
- Как сделать, чтобы такие обертки работали для функций с переменным количеством аргументов (fcntl, ioctl)?
- Каковы накладные расходы использования исключений вместо кодов ошибок?
- Правильно ли я понимаю, что при ошибке в POSIX всегда возвращается именно -1?
- Есть ли смысл переписать код, заменив шаблоны на макросы?
- Файл с обертками нужно будет подключать во все места где они используются. Может ли это стать причиной медленной компиляции, и как с этим бороться?
Наверняка есть более адекватные способы для обработки кодов ошибок в C++, но нагуглить их сходу не удается.