Полезно, чтобы полезная библиотека C не предоставляла привязки C ++.Легко вызывать C из C ++, но, помимо прочего, проект C ++, вероятно, хочет исключения, а не числовые возвращаемые значения ошибок.
Есть ли какое-то конкретное соглашение или прием для преобразования в исключения без включения if
и throw
с каждым вызовом функции?
Я написал это решение для упаковки вызовов gphoto2.Оборачивать шаблонную функцию в макрос неудобно (но имя функции важно для сообщений об ошибках; логика здесь похожа на perror
).
Есть ли лучший метод или проект с открытым исходным кодом, который делает это особенно хорошо?
#include <gphoto2/gphoto2.h>
#include <string>
class Gphoto2Error : public std::exception {
private:
std::string message;
public:
Gphoto2Error(std::string func, int err) {
message = func + ": " + std::string(gp_result_as_string(err));
}
const char *what() const throw() {
return message.c_str();
}
};
template <typename F, typename... Args>
void _gpCall(const char *name, F f, Args... args) {
int ret = f(args...);
if (ret != GP_OK) {
throw Gphoto2Error(name, ret);
}
}
#define gpCall(f, ...) ((_gpCall(#f, ((f)), __VA_ARGS__)))
int main() {
GPContext *ctx = gp_context_new();
Camera *camera;
gpCall(gp_camera_new, &camera);
gpCall(gp_camera_init, camera, ctx);
}