2012-11-29 16 views
9

यह काम करता है के साथ समारोह ...उपयोग decltype और std :: लैम्ब्डा

auto x = 4; 
typedef decltype(x) x_t; 
x_t y = 5; 

... तो क्यों यह नहीं करता है?

int j = 4; 
auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;}; 
typedef decltype(func) lambda_t; 
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;}; 

... और कैसे मैं घोषणा करेंगे lambda_t मैन्युअल std :: समारोह का उपयोग कर?

उत्तर

14

... तो यह [काम] क्यों नहीं है?

क्योंकि लैम्ब्डा के प्रत्येक व्याख्यात्मक उदाहरण में एक अलग प्रकार है। इससे कोई फर्क नहीं पड़ता कि एक ही अक्षर का उपयोग किया जाता है।

.. और मैं std :: function का उपयोग करके lambda_t मैन्युअल रूप से कैसे घोषित करूं?

लैम्ब्डा किसी पूर्णांक तर्क लेता है और कुछ भी वापस नहीं करता है ... इसलिए:

typedef std::function<void(int)> lambda_t; 
7

लैम्ब्डा प्रकार अनिर्वचनीय (नामित नहीं किया जा सकता) कर रहे हैं, जो कारण है कि तुम क्या नहीं कर सकता है आप पूछ रहे हैं इसके अलावा, प्रत्येक लैम्ब्डा एक अलग प्रकार का होता है, इसलिए यदि आप इस प्रकार का नाम दे सकते हैं, तो आप पहले को दूसरे लैम्ब्डा को असाइन नहीं कर पाएंगे। यदि आप लैम्ब्डा सिंटैक्स को फ़ंक्शन ऑब्जेक्ट के शॉर्टकट के रूप में सोचते हैं जो स्पष्ट हो जाता है: सदस्य operator() प्रत्येक लैम्ब्डा के लिए अलग है और इस प्रकार वे विभिन्न प्रकार के होते हैं।

दूसरी तरफ, आप उचित हस्ताक्षर के std::function<> ऑब्जेक्ट को लैम्ब्डा असाइन कर सकते हैं, जो आपके मामले में std::function<void(int)> होगा।

+0

आप निश्चित रूप से इस प्रकार की घोषणा के साथ lambdas टाइप कर सकते हैं। –

+1

@ आर। मार्टिन्हो फर्नांडीस सवाल पूछता है कि 'decltype (func)' कुछ अनुपयोगी कचरे के बजाय 'std :: function ' वापस नहीं लौटाता है? – learnvst

+1

@learnvst: इसे क्यों चाहिए? 'decltype' घोषित प्रकार देता है, और एक लैम्ब्डा * नहीं * एक' std :: function' है। इसके अलावा, 'std :: function' में अन्य चीजों के साथ प्रदर्शन प्रभाव पड़ता है, टाइप-एरर के लिए धन्यवाद। – Xeo

0

यहां कुछ ठोस प्रमाण है कि यह काम नहीं करता है। इसी तरह के परिदृश्य:

int foo = 3; 
int bar = 3; 

std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type 

अब, सटीक कोड का उपयोग करें, लेकिन लैम्बडास के साथ। आपको क्या लगता है कि प्रतिक्रिया होगी।

auto foo = [](){std::cout << "HELLO\n"; }; 

    auto bar = [](){std::cout << "HELLO\n"; }; 

    std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same. 
संबंधित मुद्दे