簡體   English   中英

如何從 C++11 匿名函數內部訪問局部變量?

[英]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 支持捕獲:

  1. [x]
  2. 參考[&x]
  3. 當前在引用范圍內的任何變量[&]
  4. 與 3 相同,但按值[=]

您可以在逗號分隔列表[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM