2016-04-27 14 views
0

Iは、次のような基本的な変換関数とC++コードを有する:変換関数をラムダ式に変換するにはどうすればよいですか?

void convert(double *x_out, double *y_out, double *x_in, double *y_in) 
{ 
    *x_out = *x_in; 
    *y_out = *y_in; 
} 

Iは、次に変換関数に関数ポインタを取り、後で自分のコード内の別の機能を有します。

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は、コードの別の場所で呼び出されます。

私は、関数ポインタの代わりにラムダ関数を使用します。

私はラムダの周りに頭を上げることはできません。これまでのところ、この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_); 

} 

それが取り込むことができるように、私は、ラムダの宣言が機能my_func自体の内部に入るかなり確信していますローカル引数/変数。

でも、私はそれをprocess()から呼び出す方法がわかりません。

編集:、以下

を質問に答えるためのデータ、xとyのペアに作用するが、このプロセスは、このデータを操作する前に、それは翻訳機能を使用して変換する必要があります機能、processがあります。私が翻訳として与えた例は、単純に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

あなたは何を達成しようとしていますか?単に関数ポインタの代わりにラムダを使用するだけで、XYの問題が発生します。本当に必要なことを教えていただければ、適切な解決策を提案することができます。今は一般的にラムダだけを教えてもらえますが、これは仕様の繰り返しです。 – SergeyA

+0

@SergeyA私の編集支援はまったく役に立ちますか? – user3728501

答えて

2

ノンキャプチャラムダは、関数ポインタにシームレスに変換できます。そしてあなたはここでキャプチャする必要はないようです。次のコードは動作します:

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

関連する問題