2014-02-26 30 views
1

我試圖使用一個帶狀態的lambda作爲函數指針參數,這裏的狀態表示它從它的上下文中捕獲。根據這個問題,這是不合法的:Why does the implicit "lambda to function pointer conversion" forbid the "by reference" capture of static members?
使用狀態作爲函數指針參數

電流功能我想通過lambda來:void foo(void(func*)(unsigned long))

這是我創建的拉姆達的簡化版本,我想通過:

void MyClass::myClassFunc(int a, int b, int c) 
{ 
    auto myLambda = [&](unsigned long val){ a+=val;b+=val;c+=val; }; 
    foo(/*some magic conversion*/ myLambda); 
} 

簡單的解決方案,超載foovoid foo(std::function< void(unsigned long) > func)

簡單的解決方法是不可取的,因爲它要求我修改代碼,是不是英里東北。有沒有辦法,我可以以某種方式轉換lambda只在調用代碼?

+2

爲什麼'std :: function'「不鼓勵」?這是接受任意函數類型的最簡單方法。 (或者,你可以使用functor類型參數化的模板來創建一個'std :: function'),這樣可以避免任何開銷。 –

+0

你可以通過價值捕獲問題數據嗎? –

+1

@AdamBurry:如果通過值或引用捕獲任何內容,則不能將lambda轉換爲函數指針。 –

回答

1

是的,接受lambda引用。既然你不能命名它的類型,你需要一個函數模板。