我正在尝试使用数字集成库,要求我将double (*f)(double,void*)
作为参数传递给它。我怎样才能传递一个我在同一范围内创建的lambda?我试过了
auto myLambda = [&](double d, void* data) { ... }
但是lambda的类型无法转换为库所需的类型。有解决方法吗?
感谢您的时间!
答案 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);