2017-12-04 16 views
0

コード:リファレンスラムダ関数を使用して関数を呼び出す方法は?

typedef void(*callbackType) (int); 

callbackType globalCallback; 

void setit(callbackType callback) { 
    globalCallback = callback; 
} 

int main() { 
    int localVar = 5; 
    setit([](int num) { 
    std::cout << localVar; // there is an error here 
    }); 
} 

は、私は私は私が[&] {}

を使用する必要が推測setit

に送ることラムダ関数でlocalVarを使用する必要がある。しかしどのようにすることができます私がやる?私はどのように宣言すべきですsetitglobalCallback

+4

lambdasのキャプチャは関数ポインタに変換されません。代わりに 'std :: function'を使用してください。 –

答えて

3

上記のコードにはいくつかの問題があります。

あなたは何をキャプチャする必要はありませんでした場合は、関数ポインタに変換するラムダと+を使用することができます。

typedef void(*callbackType)(int); 

callbackType globalCallback; 

void setit(callbackType callback) { 
    globalCallback = callback; 
} 

int main() { 
    setit(+[](int){}); 
} 

しかし、このトリックはcapturlessラムダで動作します。

一つの可能​​な解決策は、callbackTypeを変更し、代わりにstd::functionを使用することです:うまく機能

using callbackType = std::function<void(int)>; 

callbackType globalCallback; 

void setit(callbackType callback) { 
    globalCallback = callback; 
} 

int main() { 
    int localVar = 5; 

    setit([localVar](int num) { 
     std::cout << localVar; // there is an error here 
    }); 
} 

+0

' + 'とは何ですか? 5.1.2 [expr.prim.lambda]: "lambda-captureを持たないラムダ式は、同じパラメータを持つ関数へのポインタであり、クロージャ型の関数呼び出し演算子と同じ型を返します。 "https://stackoverflow.com/a/28746827/8918119 –

+0

std :: functionを使用しても問題ありませんか? https://stackoverflow.com/a/28746827ここでは、std :: functionは重量が重いと言っています。別の方法がありますか? –

+0

@LightAlex - あなたはすでにあなたのコードを最適化していますか?最初に正しさに注目してください。 – StoryTeller

関連する問題