2016-04-27 278 views
0

我有基本转换功能,如下面的一个C++代码:如何将我的转换函数转换为lambda表达式?

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.htmlhttps://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_); 

} 

我相当肯定的拉姆达的声明去功能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

你可以改变'process'吗? – NathanOliver

+1

你想达到什么目的?简单地使用lambda而不是函数指针是一个XY问题。如果你告诉我们你真的需要什么,我们可以提出一个适当的解决方案。现在我只能一般地讲解lambda表达式,但这将是规范的重申。 – SergeyA

+0

@SergeyA我的编辑帮助吗? – user3728501

回答

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_); 
} 
+0

你为什么到处使用汽车? – user3728501

+0

'auto *'是多余的。你可以简单地使用'auto'。 – NathanOliver

+0

'lam'是函数名还是变量? – user3728501