Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针问题。如何从C+有效地与C API(即GSL)接口+;上课?_C++ - Fatal编程技术网

C++ 函数指针问题。如何从C+有效地与C API(即GSL)接口+;上课?

C++ 函数指针问题。如何从C+有效地与C API(即GSL)接口+;上课?,c++,C++,例如,这个问题以前似乎已经被问过无数次了 我想做的是,将C-Structgsl_函数的成员函数设置为我类的成员函数 class MyClass{ double foo(double x) { return ...; } double bar(double x) { ... gsl_function F; // Problem I cant do this (compiler error)

例如,这个问题以前似乎已经被问过无数次了

我想做的是,将C-Struct
gsl_函数的成员
函数设置为我类的成员函数

class MyClass{

    double foo(double x)
    {
        return ...;
    }

    double bar(double x)
    {
        ...
        gsl_function F;
        // Problem I cant do this (compiler error)
        F.function = &(this->foo);
    }
};
上面的第三个提供了一个解决方案,我认为它基于所描述的包装器方法

所以我的问题是我能做得更好吗。有没有更简单的方法?例如,可能通过使用Boost函数和绑定对象


我正在权衡使用gsl包装的选择,比如o2scl。但是我有点不情愿,因为如果包装不好的话,我以后可能会付出代价。有什么建议吗

由于GSL允许您传入任意参数,因此您可以滥用它来保持指向所讨论实例的指针。然后使用静态成员函数转发到成员函数:

class MyClass
{
    double foo(double x)
    {
       ...
    }
    static double foo_wrapper(double x, void *params)
    {
        return static_cast<MyClass*>(params)->foo(x);
    }

    double bar(double x)
    {
        ...
        gsl_function F;
        F.function=&MyClass::foo_wrapper;
        F.params=this;

        // invoke GSL function passing in F
        ...
    }
};
需要注意的是,您必须确保任何
gsl\u function\u pp
对象在gsl可能调用它的整个时间内都在作用域内。因此,不要尝试在一个函数中设置根查找器/etc(使用本地gsl_函数_pp),返回,然后在另一个函数中执行根查找迭代——您会遇到崩溃或更糟的情况

class gsl_function_pp : public gsl_function
{
public:
    gsl_function_pp(boost::function<double(double)> const& func) : _func(func)
    {
        function=&gsl_function_pp::invoke;
        params=this;
    }
private:
    boost::function<double(double)> _func;

    static double invoke(double x, void *params)
    {
        return static_cast<gsl_function_pp*>(params)->_func(x);
    }
};
class MyClass
{
    double foo(double x)
    {
        ...
    }

    double bar(double x)
    {
        gsl_function_pp F(boost::bind(&MyClass::foo, this, _1));
        // invoke GSL function passing in F
        ...
    }
};