2011-06-23 18 views
44

द्वारा पैरामीटर के रूप में लैम्ब्डा प्राप्त करने का उचित तरीका संदर्भ द्वारा int->int लैम्बडा पैरामीटर प्राप्त करने वाले फ़ंक्शन को परिभाषित करने का सही तरीका क्या है?सी ++ 0x: संदर्भ

void f(std::function< int(int) >& lambda); 

या

void f(auto& lambda); 

मुझे यकीन है कि पिछले प्रपत्र भी कानूनी वाक्य रचना है नहीं कर रहा हूँ।

क्या लैम्ब्डा पैरामीटर को परिभाषित करने के अन्य तरीके हैं?

+5

आपको संदर्भ द्वारा लैम्ब्डा की आवश्यकता क्यों होगी? क्या आपका मतलब है 'कॉन्स्ट एंड'? –

उत्तर

50

आपके पास auto पैरामीटर नहीं हो सकता है। आपके मूल रूप से दो विकल्प हैं:

विकल्प # 1: std::function का उपयोग करें जैसा आपने दिखाया है।

विकल्प # 2: टेम्पलेट पैरामीटर का उपयोग करें:

template<typename F> 
void f(F &lambda) { /* ... */} 

विकल्प # 2, कुछ मामलों में, और अधिक कुशल, हो सकता है के रूप में यह एम्बेडेड लैम्ब्डा समारोह वस्तु के लिए एक संभावित ढेर आवंटन से बच सकते हैं, लेकिन है केवल तभी संभव है जब f को हेडर में टेम्पलेट फ़ंक्शन के रूप में रखा जा सके। यह संकलन समय और आई-कैश पदचिह्न भी बढ़ा सकता है, जैसा कि कोई टेम्पलेट हो सकता है। ध्यान दें कि इसका कोई असर नहीं हो सकता है, जैसे कि लैम्ब्डा फ़ंक्शन ऑब्जेक्ट पर्याप्त छोटा है, इसे std::function ऑब्जेक्ट में इनलाइन का प्रतिनिधित्व किया जा सकता है।

+1

टेम्पलेट सामान्य गैर-स्थानीय कोड पर कूद को समाप्त करके I-कैश पदचिह्न को भी सुधार सकते हैं (इस मामले में, सामान्य रूप से सामान्य उद्देश्य 'std :: function' wrapper के माध्यम से कूदने के बिना, सीधे अपने लैम्ब्डा को निष्पादित करें) – jalf

+5

यह उद्धरण , _ "अगर लैम्ब्डा फ़ंक्शन ऑब्जेक्ट पर्याप्त छोटा है तो इसे 'std :: function' ऑब्जेक्ट में इनलाइन का प्रतिनिधित्व किया जा सकता है" _ भ्रामक है। लैम्ब्डा हमेशा इनलाइन के लिए उपलब्ध होते हैं (संकलक निश्चित रूप से नहीं चुन सकते हैं)। 'std :: function' कार्यान्वयन आम तौर पर ढेर आवंटन से बचने के लिए छोटे ऑब्जेक्ट ऑप्टिमाइज़ेशन का उपयोग करता है। यदि लैम्ब्डा में पर्याप्त छोटा _capture list_ है तो इसे ढेर का उपयोग किये बिना 'std :: function' में संग्रहीत किया जाएगा। इसके अलावा एक लैम्ब्डा के आकार का कोई वास्तविक अर्थ नहीं है। –

+1

@ बोडनान: वैसे, 'शून्य एफ (एफ और लैम्ब्डा) 'में' '' क्यों है? – Nawaz

23

मैं का प्रयोग करेंगे template के रूप में:

template<typename Functor> 
void f(Functor functor) 
{ 
    cout << functor(10) << endl; 
} 

int g(int x) 
{ 
    return x * x; 
} 
int main() 
{ 
    auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; }; 
    f(lambda); //pass lambda 
    f(g);  //pass function 
} 

आउटपुट:

500 
1000 
100 

डेमो: http://www.ideone.com/EayVq

0

मैं इस सवाल पहले से ही उत्तर दिया गया है पता है, लेकिन जब मैं जवाब के लिए देख रहा था इस सवाल के लिए, मैं यहां कुछ जवाबों की तुलना में थोड़ा अलग खोज रहा था, और मुझे लगता है कि यह हो सकता है कि ओपी क्या कह रहा था, तो यहां उम्मीद है यह किसी और की मदद करेगा। आप निम्न उपाय अपनाते हैं,

void print(int n) 
{ 
    printf("%i ", n); 
} 

आदेश में यह कार्य करने के लिए एक लैम्ब्डा पारित करने के लिए:

print([]{ 
    return 3; 
}()); 

यह कार्य करने के लिए 3 पारित करेंगे जाहिर

आप एक समारोह है कहो। एक और अधिक उपयोगी उदाहरण के लिए, विशेष रूप से ओ पी के प्रश्न से संबंधित, एक लैम्ब्डा कि अंत समारोह के लिए एक पूर्णांक एक पैरामीटर के रूप में एक पूर्णांक लेता है और रिटर्न है:

int x = 3; 

auto lambdaFunction = [](int input) { 
    return (input + 1); 
}; 

print(lambdaFunction(x)); 

यह मानते हुए है आप मान द्वारा या द्वारा उत्तीर्ण नहीं होते हैं लैम्ब्डा के संदर्भ में, जो आप सीधे कर सकते हैं:

// Pass by value 
print([=]{ 
    return (x + 1); 
}()); 

// Pass by reference 
print([&]{ 
    return (x + 1); 
}()); 
+4

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

+0

आह, ठीक है। मैं ओपी के सवाल में भाग गया, जबकि मैं अंततः जो पोस्ट किया, उसकी गलती की तलाश में था –

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