"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > मैं C++ Lambdas में, विशेषकर C++11 में, मूव कैप्चर कैसे प्राप्त कर सकता हूँ?

मैं C++ Lambdas में, विशेषकर C++11 में, मूव कैप्चर कैसे प्राप्त कर सकता हूँ?

2024-12-23 को प्रकाशित
ब्राउज़ करें:806

How Can I Achieve Move Capture in C   Lambdas, Especially in C  11?

सी लैम्ब्डा में मूव कैप्चर को समझना

सी 11 में, लैम्ब्डा में वेरिएबल्स को कैप्चर करना आम तौर पर संदर्भ द्वारा किया जाता है। यह संदर्भ तब तक जीवित रहता है जब तक लैम्ब्डा मौजूद है, जो कभी-कभी कैप्चर किए गए वेरिएबल को बाहर ले जाने पर अनपेक्षित व्यवहार का कारण बन सकता है।

एसी 14 समाधान: सामान्यीकृत लैम्ब्डा कैप्चर

सी 14 में, सामान्यीकृत लैम्ब्डा कैप्चर की शुरुआत की गई, जिससे मूव कैप्चर की अनुमति मिल गई। यह अद्वितीय पॉइंटर्स जैसे मूव-ओनली प्रकारों के सुविधाजनक हेरफेर को सक्षम बनाता है।

std::make_unique()
    .then([u = std::move(u)] { do_something_with(u); });

C 11 के लिए समाधान

C 14 से पहले, मूव कैप्चर का उपयोग करके अनुकरण किया जा सकता है सहायक कार्य:

विधि 1: make_rref

यह दृष्टिकोण एक आवरण बनाता है वर्ग, rref_impl, जो मान को समाहित करता है और उसके जीवनकाल का प्रबंधन करता है।

template  using rref_impl = ...;
auto rref = make_rref(std::move(val));

[rref]() mutable { std::move(rref.get()); };

हालांकि, लैम्ब्डा में rref को कैप्चर करने से इसे कॉपी किया जा सकता है, जिससे संभावित रूप से रनटाइम त्रुटियां हो सकती हैं।

विधि 2: कैप्चर() फ़ंक्शन

यह विधि एक का उपयोग करती है फ़ंक्शन जो संदर्भ द्वारा कैप्चर किए गए मान को लेता है और एक लैम्ब्डा लौटाता है जो कैप्चर किए गए मान वाले फ़ंक्शन को तर्क के रूप में कॉल करता है।

template  using capture_impl = ...;
auto lambda = capture(std::move(val), [](auto&& v) { return std::forward(v); });

यह लैम्ब्डा को कॉपी करने से रोकता है और यह सुनिश्चित करता है कि कैप्चर किया गया मान लैम्ब्डा के दायरे में ले जाया गया है।

याद रखें, ये वर्कअराउंड सी 14 में सामान्यीकृत लैम्ब्डा कैप्चर के समान सुरुचिपूर्ण नहीं हैं, लेकिन वे भाषा के पुराने संस्करणों में मूव कैप्चर का अनुकरण करने का एक तरीका प्रदान करें।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3