2014-12-30 7 views
5

जेनेरिक lambdas lambdas कि के रूप में पढ़ा को परिभाषित करने का एक तरीका है बनाम जेनेरिक lambdas इस प्रकार है:स्टैंडर्ड टेम्पलेट कार्य (क्या उपयोग करने के लिए और जब)

template <typename T> 
T Identity(T t){return t;} 

या

साथ:

auto identity = [](auto a){return a;} 

के साथ इस की तुलना करें

template <typename T> 
struct Identity { T operator()(T a) { return a; } }; 

यह मेरी समझ है

  1. लैम्बडास [], [=], आदि का उपयोग करके संदर्भ कैप्चर की अनुमति देता है, मुझे यकीन नहीं है कि यह सामान्य लैम्बडा में कैसे उपयोग/लागू किया जाएगा। क्या यह मुख्य अंतर है?

  2. सामान्य lambdas जबकि, टेम्पलेट विशेषज्ञता संकेत दिए गए कार्य करने के लिए डाली जा सकती है, संकेत कार्य करने के लिए डाली जा सकती है।

एक साधारण वास्तविक दुनिया का उदाहरण समझने के लिए उपयोगी होगा कि कब उपयोग करना है और कब।

[संलग्न] यहां सामान्य लैम्ब्डा प्रस्ताव है: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3559.pdf

+2

जेनेरिक लैम्ब्डा वास्तव में 'टेम्पलेट संरचना पहचान {टी ऑपरेटर() (टी ए) {रिटर्न ए; }}; 'आपके द्वारा प्रस्तुत किए गए टेम्पलेट फ़ंक्शन विकल्प से अधिक है। – cdhowie

+0

मुझे लगता है कि यह "कार्यों पर lanbdas का उपयोग करने के लिए" उबालता है, जिसका उत्तर दिया गया है [यहां] (http://programmers.stackexchange.com/questions/98159/what-is-the-necessity-to-go- for-lambda-functions-and-expressions-in-c) – OMGtechy

+2

@OMGtechy: वास्तव में नहीं। जेनेरिक लैम्बडास संभावित मेटा प्रोग्रामिंग अवसरों के कई हिस्सों को उजागर करेंगे जो वर्तमान में टेम्पलेट्स के संदर्भ में संभव नहीं हैं क्योंकि वे चर (मूल्य या संदर्भ द्वारा) नहीं ले सकते हैं। इसमें जोड़ा गया है, संकलन समय पर प्रकार निर्धारण यह बेहद शक्तिशाली बना सकता है। मैं खुद को टेम्पलेटेड कक्षाओं के अंदर कुछ अनुप्रयोगों को देख रहा हूं लेकिन सवाल सामान्य लैम्बडास पर विचारों को पूल करना है। – Ram

उत्तर

6

सुंदर ज्यादा lambdas की तरह, सामान्य lambdas एक परोक्ष परिभाषित समारोह वस्तु (जहां गैर सामान्य lambdas खाली कब्जा करने के साथ अतिरिक्त क्षमता है कि करने के लिए तुल्यता के माध्यम से परिभाषित कर रहे हैं वे एक फ़ंक्शन पॉइंटर में कनवर्ट कर सकते हैं)। जेनेरिक और गैर-जेनेरिक लैम्बडास के बीच एकमात्र वास्तविक अंतर यह है कि सामान्य लैम्ब्डा में कॉल ऑपरेटर होता है जो एक फ़ंक्शन टेम्पलेट होता है जबकि यह गैर-जेनेरिक लैम्बडास के लिए एक गैर-टेम्पलेट होता है।

  1. सामान्य lambdas के लिए समारोह संकेत करने के लिए रूपांतरण मौजूद नहीं है (5.1.2 [expr.prim.lambda] पैरा 6 देखें)।
  2. के बाद से सामान्य lambdas अभी भी एक फोन ऑपरेटर के साथ वस्तुओं रहे हैं, वे एक तर्क जहां एक सामान्य समारोह वस्तुओं इस्तेमाल किया जा सकता के रूप में सीधे इस्तेमाल किया जा सकता है। फ़ंक्शन टेम्पलेट्स के लिए यह मामला नहीं है: ये एक अधिभार सेट की तरह व्यवहार करते हैं और आपको फ़ंक्शन ऑब्जेक्ट के रूप में उन्हें पास करने से पहले तत्काल प्राप्त करने की आवश्यकता होती है।
  3. हालांकि आप एक समारोह टेम्पलेट के लिए सूचक नहीं मिल सकता है, तो आप एक समारोह टेम्पलेट विशेषज्ञता के लिए सूचक प्राप्त कर सकते हैं (@Columbo एक टिप्पणी में कहा के रूप में, एक समारोह टेम्पलेट विशेषज्ञता एक समारोह है)। आप सामान्य लैम्ब्डा से किसी फ़ंक्शन में पॉइंटर नहीं प्राप्त कर सकते हैं।
  4. समारोह टेम्पलेट्स अधिभार संकल्प में भाग लेने जबकि समारोह वस्तुओं वास्तव में भाग नहीं लेते: एक वस्तु नाम के दौरान पाया जाता है जब लुक-अप इस वस्तु भले ही एक ही नाम के साथ और के लिए एक अच्छी मैच के साथ पाया कार्यों हो सकता है चुना जाता है अधिक भार। इसका मतलब है, कि इन दो नहीं बराबर हैं:

    template <typename T> 
    auto identity(T value) { return value; } 
    auto identity = [](auto value) { return value; } 
    

    दूसरा कार्यान्वयन नाम hijacks जबकि पूर्व अधिभार संकल्प में एक उम्मीदवार के रूप में इस्तेमाल किया जाता है।

एक तरफ एक समारोह मैं कार्य करता है जो अनुकूलन अंक के रूप में नहीं होती हैं के लिए सामान्य lambdas का प्रयोग करेंगे भीतर से बनाए गए सहायक वस्तुओं से (उदाहरण के लिए अच्छा होगा अगर मानक पुस्तकालय एल्गोरिदम इस तरह की वस्तुओं थे)। मुख्य लाभ यह है कि कार्य वस्तुओं को आसानी से अनुकूलित किया जा सकता है, उदा।, std::bind() का उपयोग कर जो फ़ंक्शन टेम्पलेट्स के लिए सही नहीं है।

+0

फ़ंक्शन टेम्पलेट विशेषज्ञता एक फ़ंक्शन है। – Columbo

+1

गैर-कैप्चरिंग जेनेरिक लैम्ब्डा फ़ंक्शन पॉइंटर्स में कनवर्ट करते हैं: "जेनेरिक लैम्ब्डा के लिए कोई लैम्ब्डा-कैप्चर नहीं होता है, बंद करने के प्रकार में सार्वजनिक गैर-वर्चुअल गैर-स्पष्ट कॉन्स्ट रूपांतरण फ़ंक्शन टेम्पलेट फ़ंक्शन करने के लिए होता है।" –

+0

क्या आप कृपया अपने बहुत अच्छे उत्तर को [इस समान लेकिन पहले प्रश्न] को स्थानांतरित/लिंक कर सकते हैं (http://stackoverflow.com/questions/22876163/when-use-a-function-template-instead-of-a-generic- लैम्ब्डा)? – Walter

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