2013-04-06 14 views
19

ラムダ関数を使ってstd::condition_variable wait()関数に渡しましたが、そうではありません。パラメータを受け取らないラムダ関数を使用していますが、私にとってはすべてが明確です。しかし、私は完全にどのようにパラメータリストを持つlamdba関数が使用されて理解していない。パラメータが表示されたラムダを使用していますか?パラメータを渡すには?パラメータを持つC++ 11ラムダ関数 - パラメータを渡す方法

+2

lambdaで見つけたリソースは、パラメータを取る。 – chris

+0

@chris私はパラメータを取るためにhpwを知っています - [](int parameter){lambda body}、私はこのラムダを使用しますか? – Littlebitter

+1

関数とまったく同じです。 – chris

答えて

24

表示ラムダが使用されていますか?パラメータを渡すには?

まさに呼び出し可能オブジェクトの他のタイプと同じように動作します:

#include <iostream> 

int main() 
{ 
    auto l = [] (int i) { std::cout << "The answer is " << i; }; 
    l(42); 
} 

また、あなたがそれを呼び出すために変数にラムダを保存する必要がないことに、注意してください。以下は、上記のプログラムを書き換えるための別の方法である:

#include <iostream> 

int main() 
{ 
    [] (int i) { std::cout << "The answer is " << i; } (42); 
    //             ^^^^ 
    //         Invoked immediately! 
} 

ラムダ関数(いわゆる「ラムダ閉鎖」)のタイプは、コンパイラによって定義され、コールオペレータとのファンクタであります署名は、ラムダを定義するときに指定するものです。したがって、ファンクタを呼び出すのとまったく同じようにラムダを呼び出すことができます(つまり、関数や呼び出し可能なオブジェクトと同じように)。

したがって、ラムダをオブジェクトに割り当てる場合は、autoを使用してコンパイラに型を推定させることをお勧めします。あなたはしたくないか、auto、あなたかもしれ使用できない場合は、次の(キャプチャラムダは、関数ポインタに変換ではありません)非キャプチャラムダのため

  1. 使用関数ポインタを。上記の場合では、このように、次のようにも動作します:

    #include <iostream> 
    
    int main() 
    { 
        void (*f)(int) = [] (int i) { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
  2. 使用std::function(ラムダがキャプチャされた場合でも、これは、常に可能です):

    #include <iostream> 
    #include <functional> 
    
    int main() 
    { 
        std::function<void(int)> f = [] (int i) 
               { std::cout << "The answer is " << i; }; 
        f(42); 
    } 
    
+4

私は誰もが簡単に説明できる人が大好きです:) ありがとうAndy !! –

+0

@JohnnyPauling:ありがとうございました:) –

4
auto lambda = [] (int a, int b) { return a + b; }; 
assert(lambda(1, 2) == 3); 
+0

ああ!ここで自動的にint(* p)(int、int)を隠すか? – Littlebitter

+0

@Littlebitter lambdaのタイプは実装定義であるため、 'auto'が必要です。いくつかのラムダ(何も取り込まないもの)を関数ポインタに変換することはできますが、実際の型ではありません( 'int'を' long'に変換する方法に似ていますが、 'int'は'ロング)。 –

+0

であり、ラムダが[](int a、int b) - > int {return a + b; }; autoを使わずにタイプIの関数変数へのポインタを作成することは可能でしょうか? – Littlebitter

1

あなたがドン」あなたのラムダを保持するための変数が必要でもあります - それを直接呼び出すことができます:

std::cout << [](int n) { return n + 1 ; } (99) << std::endl ; 
関連する問題