2014-04-04 12 views
7

Ich möchte einen Griff unterbreiten, aber ich will es nur dann, wenn ein gemeinsamer Zeiger noch gültig ist ausgeführt werden:Kann ich eine Variable innerhalb einer Lambda Capture-Klausel deklarieren?

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

Kann ich innerhalb des Fang-Klausel der Lambda erklären slave? So etwas wie const auto hook = [std::weak_ptr<int> slave = node,=]()...., aber leider funktioniert das nicht. Ich würde es gerne vermeiden, die Variable zu deklarieren und dann zu kopieren (nicht aus Performance-Gründen; ich denke nur, es wäre klarer und sauberer, wenn ich alles schaffen könnte, was das Lambda braucht, ohne den umschließenden Bereich zu verschmutzen).

+3

Nur in C++ 14, tut mir leid zu sagen. – chris

+0

@chris ah ... Nun, ich habe die C++ 1y Flagge hinzugefügt, wenn Sie das als Antwort hinzufügen möchten, werde ich es markieren. Prost. – arman

Antwort

10

Sie können dies unter Verwendung von verallgemeinerten Lambda tun ++ 14 C erfasst in:

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

hier ein live example ist. Beachten Sie, dass die leere Parameterliste (()) weggelassen werden kann, da keine Parameter oder ein expliziter Rückgabetyp vorhanden sind.

Verwandte Themen