#include <iostream>
#include <functional>
struct my_f_params {
double flag;
std::function<double(double)> inter_auto;
};
double xrootf(double x, void * p)
{
my_f_params * params = static_cast<my_f_params*>(p);
return params->flag * params->inter_auto(x);
}
auto new_f(double x){
return [x](double y) {
return x * y;
};
}
int main(int argc, char const *argv[])
{
my_f_params p;
p.flag = 123.45;
p.inter_auto = new_f(-0.5);
std::cout << xrootf(+2, &p) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnN0cnVjdCBteV9mX3BhcmFtcyB7IAogICAgZG91YmxlIGZsYWc7IAogICAgc3RkOjpmdW5jdGlvbjxkb3VibGUoZG91YmxlKT4gaW50ZXJfYXV0bzsKfTsKCmRvdWJsZSB4cm9vdGYoZG91YmxlIHgsIHZvaWQgKiBwKQp7CiAgICBteV9mX3BhcmFtcyAqIHBhcmFtcyA9IHN0YXRpY19jYXN0PG15X2ZfcGFyYW1zKj4ocCk7CiAgICByZXR1cm4gcGFyYW1zLT5mbGFnICogcGFyYW1zLT5pbnRlcl9hdXRvKHgpOwp9CgphdXRvIG5ld19mKGRvdWJsZSB4KXsKICAgIHJldHVybiBbeF0oZG91YmxlIHkpIHsKICAgICAgICByZXR1cm4geCAqIHk7CiAgICB9Owp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciBjb25zdCAqYXJndltdKQp7CiAgICBteV9mX3BhcmFtcyBwOwogICAgcC5mbGFnID0gMTIzLjQ1OwogICAgcC5pbnRlcl9hdXRvID0gbmV3X2YoLTAuNSk7CiAgICBzdGQ6OmNvdXQgPDwgeHJvb3RmKCsyLCAmcCkgPDwgc3RkOjplbmRsOwogICAgcmV0dXJuIDA7Cn0=