[英]How can I access local variables from inside a C++11 anonymous function?
我正在對向量(權重)進行簡單的歸一化,試圖利用 STL 算法使代碼盡可能干凈(我意識到這對於 for 循環來說非常簡單):
float tot = std::accumulate(weights.begin(), weights.end(), 0.0);
std::transform(weights.begin(), weights.end(), [](float x)->float{return(x/tot);});
目前, tot 對匿名函數不可見,因此無法編譯。 使局部變量對匿名函數可見的最佳方法是什么?
你需要一個關閉。
float tot = std::accumulate(weights.begin(), weights.end(), 0);
std::transform(weights.begin(), weights.end(), [tot](float x)->float{return(x/tot);});
在這種情況下, tot
是按值捕獲的。 C++11 lambdas 支持捕獲:
[x]
[&x]
[&]
[=]
您可以在逗號分隔列表[x, &y]
混合上述任何內容。
lambda 可以從環境范圍“捕獲”變量:
[ ..., N, ... ](int a, int b) -> int { return (a + b) * N; }
^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^
captured vars local params ret.type
您可以按值或按引用捕獲,並且可以使用特殊語法[=]
和[&]
從環境范圍捕獲任何內容,即您實際最終使用的任何內容。
您需要將tot
添加到“捕獲列表”中:
float tot = std::accumulate(weights.begin(), weights.end(), 0);
std::transform(weights.begin(), weights.end(), [tot](float x)->float{return(x/tot);});
或者,您可以使用默認捕獲來隱式捕獲tot
:
float tot = std::accumulate(weights.begin(), weights.end(), 0);
std::transform(weights.begin(), weights.end(), [=](float x)->float{return(x/tot);});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.