2010-05-14 13 views
67

क्या मूल्य से कैप्चर करने का कोई तरीका है, और कैप्चर किए गए मूल्य को गैर-कॉन्स बनाएं? मेरे पास एक लाइब्रेरी फ़ैक्टर है जिसे मैं & पर कब्जा करना चाहता हूं, जिस तरह से गैर-आधार है लेकिन होना चाहिए।सी ++ 0x लैम्ब्डा मूल्य हमेशा कैप्चर द्वारा कब्जा?

निम्नलिखित संकलित नहीं है लेकिन foo :: ऑपरेटर() कॉन्स इसे ठीक करता है।

struct foo 
{ 
    bool operator() (const bool & a) 
    { 
    return a; 
    } 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    foo afoo; 

    auto bar = [=]() -> bool 
    { 
     afoo(true); 
    }; 

    return 0; 
} 

उत्तर

104

उपयोग परिवर्तनशील।


auto bar = [=]() mutable -> bool .... 

परिवर्तनशील आप लैम्ब्डा वस्तु स्थिरांक के ऑपरेटर() की घोषणा कर रहे हैं के बिना।

0

परिवर्तनीय (क्रेज़ी एडी द्वारा प्रस्तावित समाधान) का उपयोग करने का वैकल्पिक तरीका है।

के साथ [=] आपका ब्लॉक सभी वस्तुओं को मूल्यों से कैप्चर करता है। आप [&] उपयोग कर सकते हैं संदर्भ द्वारा सभी वस्तुओं पर कब्जा करने की:

auto bar = [&]() -> bool 

या आप संदर्भ केवल कुछ वस्तु [=, & afoo] द्वारा कब्जा कर सकते हैं:

auto bar = [=, &afoo]() -> bool 

इस का संदर्भ लें फोर विवरण के लिए पृष्ठ (स्पष्टीकरण अनुभाग): http://en.cppreference.com/w/cpp/language/lambda

+7

यह पूरी तरह से अलग चीजें करता है। वे विनिमय नहीं कर सकते हैं। यह ओपी के सवाल का जवाब नहीं देता है। –

+1

इस समाधान की समस्या यह है कि यह लैम्ब्डा निष्पादित होने से पहले नष्ट कैप्चर किए गए स्थानीय चर के लिए काम नहीं करता है (उदाहरण के लिए, जब आप एक अलग std :: धागा शुरू करते हैं)। –

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