#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;
}