#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==