2014-04-04 9 views
7

मैं एक संभाल प्रस्तुत करना चाहते हैं, लेकिन मैं केवल यह अगर एक साझा सूचक अभी भी मान्य है क्रियान्वित किया जा करना चाहते हैं:क्या मैं एक लैम्ब्डा कैप्चर क्लॉज के अंदर एक चर घोषित कर सकता हूं?

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

मैं लैम्ब्डा का कब्जा खंड के भीतर slave घोषित कर सकते हैं? const auto hook = [std::weak_ptr<int> slave = node,=]().... की तरह कुछ लेकिन दुर्भाग्यवश यह काम नहीं करता है। मैं चर को घोषित करने से बचाना चाहता हूं और फिर इसे कॉपी करना चाहता हूं (प्रदर्शन कारणों से नहीं; मुझे लगता है कि यह स्पष्ट और नीरस होगा अगर मैं लम्बा को जो भी गुंजाइश को प्रदूषित किए बिना जरूरी बनाता है)।

+3

केवल सी ++ 14 में, कहने के लिए खेद है। – chris

+0

@chris आह ... ठीक है मैंने सी ++ 1y ध्वज जोड़ा है, इसलिए यदि आप इसे एक उत्तर के रूप में जोड़ना चाहते हैं तो मैं इसे चिह्नित करूंगा। चीयर्स। – arman

उत्तर

10

आप इस का उपयोग कर सामान्यीकृत लैम्ब्डा में कब्जा सी ++ 14 कर सकते हैं:

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

यहाँ एक live example है। ध्यान दें कि चूंकि कोई पैरामीटर या स्पष्ट रिटर्न प्रकार नहीं है, इसलिए खाली पैरामीटर सूची (()) छोड़ी जा सकती है।

संबंधित मुद्दे

 संबंधित मुद्दे