我有一个带有基本转换函数的C ++代码,例如:
void convert(double *x_out, double *y_out, double *x_in, double *y_in)
{
*x_out = *x_in;
*y_out = *y_in;
}
然后我在我的代码中有另一个函数,它接受一个转换函数的函数指针。
void process(void (*converter)(double *x_out, double *y_out, double *x_in, double *y_in), double x1, double y1, double x2, double y2)
{
(*converter)(x1, y1, x2, y2);
// do something
return something;
}
process
在代码的其他地方调用。
void my_func(...args...)
{
process(&convert, _x1_, _y1_, _x2_, _y2_);
}
我想使用lambda函数而不是函数指针方法。
我无法理解lambda。
到目前为止,我最好的猜测是http://en.cppreference.com/w/cpp/language/lambda此http://www.cprogramming.com/c++11/c++11-lambda-closures.html以及此https://msdn.microsoft.com/en-gb/library/dd293608.aspx是:
void my_func(double _x1_, double _y1_, double _x2_, double _y2_)
{
[&_x1_, &_x2_, &_y1_, &_y2_] -> void
{
double x_in = _x1_;
double y_in = _y1_;
double x_out = x_in;
double y_out = y_in;
// return
_x2_ = x_out;
_y2_ = y_out;
}
process(what goes here?, _x1_, _y1_, _x2_, _y2_);
}
我很确定lambda的声明是在函数my_func
内部进行的,因此它可以捕获局部参数/变量。
但我不确定如何从process()
调用它?
编辑:要回答以下问题,
有一个函数process
作用于数据对x和y,但在进程对此数据进行操作之前,必须使用转换函数对其进行转换。我作为翻译给出的例子很简单,x-> x y-> y,但更有趣的一个可能是x-> 2x,y-> 0.5y。
错误讯息:
no known conversion for argument 1 from
‘namespace::classname::my_func(uint32_t, uint32_t, uint32_t,
uint32_t)::<lambda(int32_t*, const int32_t*, int32_t*, const
int32_t*)>’ to ‘void (namespace::classname::*)(int32_t*, const
int32_t*, int32_t*, const int32_t*) {aka void
(namespace::classname::*)(int*, const int*, int*, const int*)}’
示例中的参数应该是int32_t
而不是加倍,但这显然不是最重要的。
答案 0 :(得分:2)
非捕获lambdas可以无缝转换为函数指针。而且你似乎不需要捕获。以下代码可以工作:
void my_func(double _x1_, double _y1_, double _x2_, double _y2_)
{
auto lam = [](double* x_in, double* y_in, double* x_out, double* y_out)
{
*x_out = *x_in;
*y_out = *y_in;
};
process(lam, _x1_, _y1_, _x2_, _y2_);
}