How can I access local variables from inside a C++11 anonymous function?

后端 未结 3 1132
离开以前
离开以前 2020-12-24 06:29

I\'m doing a simple normalization on a vector (weights), trying to make use of STL algorithms to make the code as clean as possible (I realize this is pretty trivial with fo

相关标签:
3条回答
  • 2020-12-24 06:44

    You need to add tot to the "capture list":

    float tot = std::accumulate(weights.begin(), weights.end(), 0);
    std::transform(weights.begin(), weights.end(), [tot](float x)->float{return(x/tot);});
    

    Alternatively you can use a capture-default to capture tot implicitly:

    float tot = std::accumulate(weights.begin(), weights.end(), 0);
    std::transform(weights.begin(), weights.end(), [=](float x)->float{return(x/tot);});
    
    0 讨论(0)
  • 2020-12-24 06:52

    The lambda can "capture" variables from the ambient scope:

    [ ..., N, ... ](int a, int b) -> int  { return (a + b) * N; }
     ^^^^^^^^^^^^^  ^^^^^^^^^^^^     ^^^^
     captured vars  local params     ret.type
    

    You can capture by value or by reference, and you can use the special syntax [=] and [&] to capture anything from the ambient scope, i.e. anything you actually end up using.

    0 讨论(0)
  • 2020-12-24 06:56

    You need a closure.

    float tot = std::accumulate(weights.begin(), weights.end(), 0);
    std::transform(weights.begin(), weights.end(), [tot](float x)->float{return(x/tot);});
    

    In this case tot is captured by value. C++11 lambdas support capturing by:

    1. value [x]
    2. reference [&x]
    3. any variable currently in scope by reference [&]
    4. same as 3, but by value [=]

    You can mix any of the above in a comma separated list [x, &y].

    0 讨论(0)
提交回复
热议问题