2014-04-04 10 views
7

Voglio presentare una maniglia, ma ho solo voglia di essere eseguito se un puntatore condiviso è ancora valido:Posso dichiarare una variabile all'interno di una clausola di cattura lambda?

// 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 

Posso dichiarare slave all'interno della clausola di cattura del lambda? Qualcosa come const auto hook = [std::weak_ptr<int> slave = node,=]().... ma sfortunatamente questo non funziona. Vorrei evitare di dichiarare la variabile e quindi copiarla (non per motivi di prestazioni, ma penso che sarebbe più chiara e ordinata se potessi creare tutto ciò che serve al lambda senza inquinare l'ambito che lo racchiude).

+3

Solo in C++ 14, mi dispiace dirlo. – chris

+0

@chris ah ... beh, ho aggiunto il flag C++ 1y, quindi se vuoi aggiungerlo come risposta lo contrassegnerò. Saluti. – arman

risposta

10

È possibile eseguire questa operazione utilizzando Lambda generalizzata cattura in C++ 14:

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

Ecco un live example. Si noti che poiché non ci sono parametri o tipo di ritorno esplicito, l'elenco dei parametri vuoti (()) può essere omesso.

Problemi correlati