Общая функция bind () с Boost

У меня есть некоторые функции в стиле C, которые возвращают 0 указать на успех, и != 0 по ошибке.
Я хотел бы «обернуть» их в void функции, которые throw вместо возврата значения.

Я написал этот помощник:

void checkStatus(int status) {
if (status != 0)
// throw an error object
}

Затем, чтобы обернуть определенную функцию int tilt(float degrees), Я использую boost::bind:

function<void(float)> ntilt = bind(checkStatus, bind(tilt, _1));
ntilt(30); // this will call checkStatus(tilt(30))

И это прекрасно работает. Но я хотел бы иметь специальную функцию-обертку, поэтому я могу просто сделать:

function<void(float)> ntilt = wrap(tilt);
ntilt(30); // this will call checkStatus(tilt(30))

Это должно работать для любой функция / подпись, которая возвращает int,
Что было бы лучшим способом сделать это с помощью Boost?

-1

Решение

Вы можете создать несколько перегрузок для обработки различного количества параметров, которые могут принимать ваши упакованные функции:

// handles 1 parameter functions
template<typename Ret, typename T0>
function<void(T0)> wrap(Ret (*fun)(T0)) {
return bind(checkStatus, bind(fun, _1));
}

// handles 2 parameters functions
template<typename Ret, typename T0, typename T1>
function<void(T0, T1)> wrap(Ret (*fun)(T0, T1)) {
return bind(checkStatus, bind(fun, _1, _2));
}

// ... add more

Вот реализация C ++ 11. Вы можете избежать некоторых вещей, если вы не хотите std::function, но хорошо, это работает:

#include <functional>
#include <stdexcept>

template<typename Ret, typename... Args>
struct wrapper {
typedef Ret (*function_type)(Args...);

void operator()(Args&&... args) {
if(fun(std::forward<Args>(args)...) != 0)
throw std::runtime_error("Error");
}

function_type fun;
};

template<typename Ret, typename... Ts>
std::function<void(Ts...)> wrap(Ret (*fun)(Ts...)) {
return std::function<void(Ts...)>(wrapper<Ret, Ts...>{fun});
}

Вот это живое демо.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector