C++ 将lambda传递到数值库

C++ 将lambda传递到数值库,c++,c++11,lambda,C++,C++11,Lambda,我试图使用一个数值积分库,它要求我将一个double(*f)(double,void*)作为参数传递给它。如何将在同一范围内创建的lambda传递给它?我试过了 auto myLambda = [&](double d, void* data) { ... } 但lambda的类型无法转换为库所需的类型。有解决办法吗 谢谢你抽出时间 只有没有捕获的lambda可能会衰减为函数指针 我怀疑void*是传递用户数据的方式。 所以你必须创建一个结构 struct Functor {

我试图使用一个数值积分库,它要求我将一个
double(*f)(double,void*)
作为参数传递给它。如何将在同一范围内创建的lambda传递给它?我试过了

auto myLambda = [&](double d, void* data) { ... }
但lambda的类型无法转换为库所需的类型。有解决办法吗


谢谢你抽出时间

只有没有捕获的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
};

只有没有捕获的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
};

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

template <class F>
double function_for_library(double d, void* data) {
    F& f = *static_cast<F*>(data);
    return f(d);
}
invoke_library(function_for_library<F>, &f); // implicit conversion to void*
对于lambda,您必须使用
decltype
,但这没什么大不了的

auto myLambda = /* ... */;
invoke_library(function_for_library<decltype(myLambda)>, &myLambda);
auto myLambda=/*…*/;
调用\u库(函数\u用于\u库和myLambda);

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

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

template <class F>
double function_for_library(double d, void* data) {
    F& f = *static_cast<F*>(data);
    return f(d);
}
invoke_library(function_for_library<F>, &f); // implicit conversion to void*
template<class T>using type=T;
template<class F>
struct callback_t {
  F data;
  void* pdata(){return &data;}
  template<class R, class...Args>
  operator type<R(*)(Args...,void*)>()const{
    return [](Args...args,void*pdata)->R{
      F* data=static_cast<F*>(pdata);
      return (*f)(std::forward<Args>(args)...);
    };
  }
};
template<class F>
callback_t<F> callback(F f){
  return{std::move(f)};
}
对于lambda,您必须使用
decltype
,但这没什么大不了的

auto myLambda = /* ... */;
invoke_library(function_for_library<decltype(myLambda)>, &myLambda);
auto myLambda=/*…*/;
调用\u库(函数\u用于\u库和myLambda);
或者,您可以编写另一个推断类型的包装器

template<class T>using type=T;
template<class F>
struct callback_t {
  F data;
  void* pdata(){return &data;}
  template<class R, class...Args>
  operator type<R(*)(Args...,void*)>()const{
    return [](Args...args,void*pdata)->R{
      F* data=static_cast<F*>(pdata);
      return (*f)(std::forward<Args>(args)...);
    };
  }
};
template<class F>
callback_t<F> callback(F f){
  return{std::move(f)};
}
然后传递
cb
代替函数指针,并传递
void*
参数的
cb.pdata()

然后传递
cb
代替函数指针,并传递
void*
参数的
cb.pdata()