簡體   English   中英

C ++ lambda - 捕獲成員變量

[英]C++ lambda - capture member variable

我有一個類,它具有指向內核函數的函數指針,可以從外部改變。

class Bar 
{
   public:
     int i;
}

class Foo 
{
   public:
     std::function<double()> kernel;
     Bar bar;         
};

int main()
{

  Foo f;
  f.kernel = []() -> double { return i * i; }; //this is not working obviously

}

我怎樣才能實現“呈現”的行為,例如。 讀取lambda中的類變量。 我可以通過傳入f並且寫入f.bar.i來繞過它,但這不是一個很好的解決方案。

在C ++ 14中你可以把它寫成,

f.kernel = [&i = f.bar.i]() -> double { return i * i; };

如果你沒有C ++ 14,你也可以創建另一個變量,

int &i = f.bar.i;
f.kernel = [&i]() -> double { return i*i; };

雖然傳遞f和寫f.bar.i沒什么不對。

看來你不能這樣做 沒有構造來創建成員函數lambda。

但你可能可以按照@ KerrekSB的建議,除了調度之外,還可以獲得成員函數:

class Foo 
{
public:
    double kernel()
    {
        _kernel(*this);
    }

    std::function<double(Foo &)> _kernel;
};


Foo f;
f._kernel = [](Foo &f) -> double { return f.i * f.i; };
f.kernel()

請注意,您不能將這兩個字段命名為kernel

lambda函數不知道i或Bar。 怎么會知道? 您需要傳遞參考。 如果你以不同的方式定義函數體,那么你可以將i作為參數傳遞,並在類中調用它,你應該得到你想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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