#include <unistd.h>
#include <thread>
#include <chrono>
#include <mutex>
#include <functional>
#include <iostream>
#include <cmath>
template <typename Res, typename... Args>
struct function_ptr_helper
{
public:
template<typename function_type>
static auto bind(function_type&& f) { func = std::forward<function_type>(f); }
static auto invoke(Args... args) { return func(args...); }
static auto* ptr() { return &invoke; }
private:
static std::function<Res(Args ...)> func;
};
template <typename Res, typename... Args>
std::function<Res(Args ...)> function_ptr_helper<Res, Args...>::func;
template <typename Res, typename ... Args>
auto* get_fn_ptr(std::function<Res(Args...)> const& f)
{
using type = function_ptr_helper<Res, Args...>;
type::bind(f);
return type::ptr();
}
struct test
{
double operator()(double, double) const
{
return 1.0 + c;
}
double c=1.0;
};
int main()
{
std::function<double(double,double)> f = test{};
typedef double (*funcPtr)(double,double);
funcPtr fp = get_fn_ptr(f);
return 0;
}
I2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8dGhyZWFkPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8bXV0ZXg+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxjbWF0aD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXMsIHR5cGVuYW1lLi4uIEFyZ3M+CnN0cnVjdCBmdW5jdGlvbl9wdHJfaGVscGVyCnsKcHVibGljOgogICAgdGVtcGxhdGU8dHlwZW5hbWUgZnVuY3Rpb25fdHlwZT4KICAgIHN0YXRpYyBhdXRvIGJpbmQoZnVuY3Rpb25fdHlwZSYmIGYpIHsgZnVuYyA9IHN0ZDo6Zm9yd2FyZDxmdW5jdGlvbl90eXBlPihmKTsgfQoKCXN0YXRpYyBhdXRvIGludm9rZShBcmdzLi4uIGFyZ3MpIHsgcmV0dXJuIGZ1bmMoYXJncy4uLik7IH0KCXN0YXRpYyBhdXRvKiBwdHIoKSB7IHJldHVybiAmaW52b2tlOyB9Cgpwcml2YXRlOgoJc3RhdGljIHN0ZDo6ZnVuY3Rpb248UmVzKEFyZ3MgLi4uKT4gZnVuYzsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBSZXMsIHR5cGVuYW1lLi4uIEFyZ3M+CnN0ZDo6ZnVuY3Rpb248UmVzKEFyZ3MgLi4uKT4gZnVuY3Rpb25fcHRyX2hlbHBlcjxSZXMsIEFyZ3MuLi4+OjpmdW5jOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFJlcywgdHlwZW5hbWUgLi4uIEFyZ3M+CmF1dG8qIGdldF9mbl9wdHIoc3RkOjpmdW5jdGlvbjxSZXMoQXJncy4uLik+IGNvbnN0JiBmKQp7Cgl1c2luZyB0eXBlID0gZnVuY3Rpb25fcHRyX2hlbHBlcjxSZXMsIEFyZ3MuLi4+OwoJCgl0eXBlOjpiaW5kKGYpOwoJcmV0dXJuIHR5cGU6OnB0cigpOwp9CiAKc3RydWN0IHRlc3QKewoJZG91YmxlIG9wZXJhdG9yKCkoZG91YmxlLCBkb3VibGUpIGNvbnN0Cgl7CgkJcmV0dXJuIDEuMCArIGM7Cgl9Cglkb3VibGUgYz0xLjA7Cn07CgoKaW50IG1haW4oKQp7CglzdGQ6OmZ1bmN0aW9uPGRvdWJsZShkb3VibGUsZG91YmxlKT4gZiA9IHRlc3R7fTsKCQoJdHlwZWRlZiBkb3VibGUgKCpmdW5jUHRyKShkb3VibGUsZG91YmxlKTsKCQoJZnVuY1B0ciBmcCA9IGdldF9mbl9wdHIoZik7CiAgICByZXR1cm4gMDsKfQ==