2012-10-14 42 views
0

我試圖挽救一個代碼塊,並用它afterwards.So我應該能夠聲明自動變量爲全球性的,分配給它,然後調用塊:有沒有辦法保存一個自動變量並在之後使用它?

// In the header 
auto __myblock; // error 

然後:

__myblock=[]() 
{ 
    <code> 
}; 
<other code> 
__myblock(); 

但問題是我得到一個語法錯誤:我似乎必須在聲明它的那一刻初始化變量,所以我無法記住該塊並在之後使用它。我需要記住塊作爲一個全局變量或在一個類中。同樣在一個類中,我不允許聲明一個auto作爲實例變量。有沒有辦法?

+7

請勿在名稱中使用雙下劃線。任何與這些保留的實施。無論如何,它總是會是一個具有相同函數簽名的lambda?如果是這樣,只需將其聲明爲適當的'std :: function'類型即可。 – chris

+3

'auto'變量必須在創建時初始化。你不能像你那樣使用它。 – 0x499602D2

+0

@chris:這是一個好主意,它可能適合OP的需求。但應該指出的是,它不是一回事,並且'std :: function'的性能特性比裸lambda差。 –

回答

2

有你的問題中的兩個問題:

  1. 我可以宣告提前自動變量(前初始化)
  2. 如何我存儲lambda函數

答案第一問題是'否':自動變量的聲明必須伴隨初始化。你不能有:

auto x; // error 
x = 42; 

本身,因爲編譯器不會知道在聲明什麼x應該是。在另一方面:

auto x = 42; 

是有效的,因爲42爲int,所以編譯器分配對於x

對於第二個問題使用std ::函數的整數。它儘可能優化。有一些細節需要考慮。具體來說:代碼塊<代碼>指的是lambda函數範圍之外的變量。如果確實如此,你是否希望它通過值或引用來引用這些變量。所有這些變量都必須存儲在某處(a.k.a. capture),這就是std :: function的作用。如果你沒有任何捕獲,std :: function基本上是一個簡單的指向函數的指針,它是儘可能優化的。在頭有:

// with no capture: 
std::function<void()> _myblock; 

// if you have capture (say, two integers) 
std::function<void(int,int)> _myblock 

,並在源有:

// no capture: 
_myblock = []() { <code> } 

// with capture: 
_myblock = [x,y](int x, int y) { <code> } 

最後,作爲評論者之一指出,如果你沒有捕獲,做最好的事情是隻需將代碼<代碼>代入函數並稍後調用它。

+0

這裏的捕獲代碼有點奇怪。 '[x,y] {}不會將整數作爲參數,它可以在沒有這些參數的情況下訪問它們。 – Xeo

+0

@Xeo,你是對的。在lambda中,不需要有正式的參數(事實上,沒有參數的形式就是規範形式)。我添加了它的可讀性,但肯定可以刪除。 – Uri

相關問題