2015-02-17 6 views
11

अभी मैं एक लैम्ब्डा के साथ एक वस्तु समारोह है, आदेश सदस्य कार्य करता है और चर का उपयोग करने के मैं करने के लिए होता है (या पाठ्यक्रम पर कब्जा सब .. की):कैप्चर स्थिरांक इस

void MyClass::MyFunc() { 

    auto myLambda = [this](){...}; 
} 

वहाँ एक रास्ता है स्पष्ट रूप से एक कॉन्स्ट कैप्चर करने के लिए राज्य? मुझे पता है कि मैं कर सकता था:

void MyClass::MyFunc() { 
    MyClass const* const_my_class = this; 
    auto myLambda = [const_my_class](){...}; 
} 

धन्यवाद।

+0

मुझे आश्चर्य होगा कि ऐसा करने का एक बेहतर तरीका है, लेकिन यह देखना दिलचस्प होगा कि कोई इसके साथ आ सकता है या नहीं। – Photon

+0

यह बहुत छोटा लगता है कि आपको इसकी आवश्यकता होगी विशेष रूप से parallel_for_each जैसे आइटम .. – Alon

+0

यदि आपका MyFunc स्थिर था तो यह स्थिर रहेगा। मुझे लगता है कि यह तब होगा जब आपको इसकी आवश्यकता होगी – Rado

उत्तर

4

प्रति §5.1.2 मानक (N3485) में, लैम्ब्डा कब्जा की परिभाषा है:

 
lambda-capture: 
    capture-default 
    capture-list 
    capture-default , capture-list 
capture-default: 
    & 
    = 
capture-list: 
    capture ... opt 
    capture-list , capture ... opt 
capture: 
    identifier 
    & identifier 
    this 

तो, आप केवल =, &, this, पहचानकर्ता हो सकता है कैप्चर सूची में, &पहचानकर्ता। आपके पास अभिव्यक्ति नहीं हो सकती है, उदाहरण के लिए this को const पर कास्टिंग करें। यह कब्जा करने की तरह नहीं है this है कि आप स्थानीय चर के रूप में ही रूप में सदस्यों को एक्सेस कर सकते हैं

auto myLambda = [self = static_cast<MyClass const*>(this)](){ 

    // Use `self` instead of `this` which is `const` 

}; 
बेशक

,:

बाद वाले संस्करणों (-std=c++1y) में कब्जा सूची में कुछ सरल भाव हों, तो उपलब्ध है, उदाहरण के लिए।

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