Доброго времени суток. Подскажите есть ли какой нибудь способ осуществить перевод из типа "std::function<int(int)>" в тип "int (*MyFunction) (int k);"
У меня есть функция
void someFnc(MyFunction collbackFn);
в которую я пытаюсь передать функцию создаваемую с помощью замыкания:
auto getFn(int ll)
{
return [=](int k)
{
std::cout<<(k+ll)<<"\n"; // тут какие то действия
return k+ll;
};
}
someFnc(getFn(12));
Однако у меня не как не получается конвертировать тип функции который я получаю на выходе из замыкания, в требуемый. Я не могу отредактировать код функции в которую передаю замыкание void someFnc(MyFunction collbackFn);, так как она не мною была написана. И мне нужно замыкание либо что то в этом роде, для того что бы сгенерировать функцию с занесенным параметром внутри (зафиксированным), так как он (параметр) будет передаваться лишь единожды и не будет не где сохраняться.
Для большей конкретики, по этой ссылке ссылке (адрес: http://cpp.sh/4ngsq), в веб среде С++ я маленький пример накидал, которых иллюстрирует ту задачу которую я не как не могу решить.
Подскажите как можно было бы решить данный вопрос ?
Вариант со статическими переменными (можно заменить static на thread_local, но как это скажется на производительности мне неизвестно):
#include <iostream>
#include <string>
#include<functional>
template<class Fn>
struct static_capture_impl;
template<class R, class... Args>
struct static_capture_impl<R(Args...)>{
using ret_value_t = R(*)(Args...);
template<class Fn>
ret_value_t operator()(Fn fn) const{
static auto state = std::move(fn);
return [](Args... args)->R{
return state(args...);
};
}
};
// Это чтобы обрабатывались и указатели на функции
template<class R, class... Args>
struct static_capture_impl<R(*)(Args...)>: public static_capture_impl<R(Args...)> {};
template<class Ret, class Fn>
auto static_capture(Fn fn){
return static_capture_impl<Ret>{}(std::move(fn));
}
/// example
using call_back_t = int(*)(int k);
int main() {
int localVar = 5;
call_back_t fn = static_capture<call_back_t>([localVar](int num) {
std::cout << localVar<<std::endl;
std::cout << num <<std::endl;
return num + localVar;
});
fn(15);
}
Если api позволяет передавать не только указатель на функцию, но и указатель на данные (void*) - можно конвертировать лямбду в void*, и передавать c-функцию, которая распаковывает void* обратно в лямбду (тут опять нужны шаблоны).
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости