如何将转换函数转换为lambda表达式?

时间:2016-04-27 18:24:43

标签: c++ c++11 lambda

我有一个带有基本转换函数的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/lambdahttp://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而不是加倍,但这显然不是最重要的。

1 个答案:

答案 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_);
}