2014-10-24 8 views
6

मेरे पास पहले से सी # अनुभव है लेकिन मैं सी ++ में नया हूं। मैंने लैम्ब्डा का उपयोग करने की कोशिश करते समय यह समस्या देखी है जैसा कि मैंने किया था।क्या मैं ऑटो के बिना सी ++ लैम्ब्डा फ़ंक्शन को परिभाषित कर सकता हूं?

उदाहरण के लिए:

auto compare = [] (int i1, int i2) { return i1*2 > i2; } 

वहाँ एक विशेष प्रकार का है, बजाय ऑटो कटौती के साथ लैम्ब्डा परिभाषित करने के लिए कोई तरीका है?

मैं यह पूछ रहा हूं क्योंकि मैं अपनी कक्षा के लिए एक आम लैम्ब्डा परिभाषित करना चाहता हूं। यह लैम्बाडा कई स्थानों पर उपयोग किया जाएगा, इसलिए मैं उन्हें कई बार परिभाषित नहीं करना चाहता हूं। हालांकि, 'ऑटो' का उपयोग केवल स्थिर सदस्यों पर ही किया जा सकता है, जबकि दूसरी ओर, मैं लैम्ब्डा में गैर स्थैतिक क्षेत्रों तक पहुंच बनाना चाहता हूं।

+1

[std :: function] (http://www.cplusplus.com/reference/functional/function/function/) का उपयोग करने का प्रयास करें। – Nard

+0

आप 'इस' को कैप्चर करके गैर स्थैतिक फ़ील्ड तक पहुंच सकते हैं। – cdhowie

उत्तर

7

आप std :: function का उपयोग करते हैं। std :: फ़ंक्शन किसी भी Lambda या फ़ंक्शन पॉइंटर को ग्लोब कर सकता है। http://en.cppreference.com/w/cpp/utility/functional/function

std::function< bool(int, int) > myFunc = [](int x, int y){ return x > y; };

+2

ध्यान दें कि 'std :: function' गतिशीलता के कारण कम कुशल है। आमतौर पर कोई फर्क नहीं पड़ता। –

+0

@siyu lambdas से कम कुशल है, लेकिन किसी भी अन्य भाषा के बराबर अमूर्तता की तुलना में अधिक कुशल है। एक फंक्शन पॉइंटर के कॉल ओवरहेड 1.5-3x आखिरी बार मैंने चेक किया (vtable लुकअप फिर कॉल करें)। 'Std :: function' implememtations हैं जो rivsl फ़ंक्शन पॉइंटर्स हैं, लेकिन प्रमुख पुस्तकालयों में नहीं जिन्हें मैं जानता हूं। – Yakk

+0

यदि आप std :: फ़ंक्शन के प्रदर्शन हिट के बारे में बहुत चिंतित हैं तो संभवतः बेहतर प्रश्न हैं कि आप प्रदर्शन संवेदनशील वातावरण में लैम्बडा का उपयोग क्यों कर रहे हैं। – BlamKiwi

3

आप std::function इस्तेमाल कर सकते हैं, लेकिन अगर वह पर्याप्त कुशल होने के लिए नहीं जा रहा है, तो आप एक functor वस्तु जो जैसा दिखता है क्या lambdas पर्दे के पीछे कर लिख सकते हैं:

auto compare = [] (int i1, int i2) { return i1*2 > i2; } 

लगभग है

struct Functor { 
    bool operator()(int i1, int i2) const { return i1*2 > i2; } 
}; 
Functor compare; 

यदि फ़ैक्टर को संदर्भ में कुछ चर को कैप्चर करना चाहिए (उदाहरण के लिए "यह" poi nter), आप निर्माता में functor अंदर सदस्यों को जोड़ने और उन्हें प्रारंभ करने की आवश्यकता:

auto foo = [this] (int i) { return this->bar(i); } 

लगभग के रूप में

struct Functor { 
    Object *that; 
    Functor(Object *that) : that(that) {} 
    void operator()(int i) const { return that->bar(i); } 
}; 
Functor foo(this); 
0

आप std::function<Signature> के रूप में के रूप में उल्लेख उपयोग कर सकते हैं ही है, लेकिन की कीमत पर लैम्ब्डा टाइप-मिटाना। जब आप अपना लैम्ब्डा कॉल करते हैं तो यह एक संकेत (मूल रूप से वर्चुअल फ़ंक्शन कॉल) जोड़ देगा। इसलिए ध्यान रखें कि यदि आप इसका संदर्भ किसी संदर्भ में उपयोग करेंगे तो यह कम कुशल होगा।

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

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