将lambda传递给数值库

时间:2015-07-30 01:05:30

标签: c++ c++11 lambda

我正在尝试使用数字集成库,要求我将double (*f)(double,void*)作为参数传递给它。我怎样才能传递一个我在同一范围内创建的lambda?我试过了

auto myLambda = [&](double d, void* data) { ... }

但是lambda的类型无法转换为库所需的类型。有解决方法吗?

感谢您的时间!

3 个答案:

答案 0 :(得分:1)

int scale=3;
auto cb = callback([&](double d){return d*scale;});

使用:

cb

然后传递cb.pdata()代替函数指针,void*传递{{1}}参数。

答案 1 :(得分:0)

据推测,这个库还允许您传入将调用所提供函数的data参数。在这种情况下,您可以定义一个包装器,将该参数视为指向您要调用的实际对象的指针,并将调用转发给该对象,可能是这样的:

template <class F>
double function_for_library(double d, void* data) {
    F& f = *static_cast<F*>(data);
    return f(d);
}

现在,如果你有一个f类型的任意函数对象F,你可以像这样调用库:

invoke_library(function_for_library<F>, &f); // implicit conversion to void*

对于lambda,你必须使用decltype,但这没什么大不了的。

auto myLambda = /* ... */;
invoke_library(function_for_library<decltype(myLambda)>, &myLambda);

或者您可以编写另一个推断类型的包装器。

答案 2 :(得分:-1)

只有没有捕获的lambda 可能会衰减到函数指针

我怀疑void*是传递用户数据的方式。 所以你必须创建一个结构

struct Functor
{
    explicit Functor(capture_t&);

    void operator()(double d)
    {
         // Your stuff
    }

    static void call(double d, void* userdata)
    {
        (*reinterpret_cast<Functor*>(userdata))(d)
    }
private:
    capture_t m_capture
};

然后致电

Functor func(capture);
library_function(&Functor::call, &func);