Как принято работать с кодами ошибок 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++, но нагуглить их сходу не удается.






