2014-04-04 34 views
7

Bir kolu göndermek istiyorum ama sadece paylaşılan bir işaretçi hala geçerli olup olmadığını yürütülecek istiyorum:Bir lambda yakalama maddesi içinde bir değişken bildirebilir miyim?

// elsewhere in the class: 
std::shared_ptr<int> node; 

// later on: 
const std::weak_ptr<int> slave(node); // can I do this in the capture clause somehow? 
const auto hook = [=]() 
{ 
    if (!slave.expired()) 
    //do something 
    else 
    // do nothing; the class has been destroyed! 
}; 

someService.Submit(hook); // this will be called later, and we don't know whether the class will still be alive 

Ben lambda yakalama maddesi içinde slave bildirebilir misiniz? const auto hook = [std::weak_ptr<int> slave = node,=]().... gibi bir şey ama maalesef bu işe yaramıyor. Değişkeni ilan etmekten kaçınmak ve sonra kopyalamak istiyorum (performans nedenleriyle değil, sadece lambda'nın kapsamını kirletmeden ne olursa olsun yaratabileceğimi daha net ve net olacağını düşünüyorum).

+3

Sadece C++ 14'te söylediğim için üzgünüm. – chris

+0

@chris ah ... ben C++ 1y bayrağını ekledim, eğer bunu bir cevap olarak eklemek isterseniz onu işaretleyeceğim. Şerefe. – arman

cevap

10

Bu kullanarak genelleştirilmiş lambda C++ 14 yılında yakalar yapabilirsiniz:

const auto hook = [=, slave = std::weak_ptr<int>(node)]() 
{ 
    ... 
}; 

İşte live example bu. Parametre veya açık dönüş tipi olmadığından boş parametre listesinin ( ()) dışarıda bırakılabileceğini unutmayın.

İlgili konular