वहाँ लैम्ब्डा समारोह चर का उपयोग करने के दो तरीके हैं: क्योंकि मैं करते हैं, पता करने के लिए मतभेद हैं क्यालैम्ब्डा समारोह चर सी ++ 11
std::function<int(int, int)>* x2 = new std::function<int(int, int)>([=](int a, int b) -> int{return a + b;});
//usage
void set(std::function<int(int, int)>* x);
std::function<int(int, int)>* get();
मैं चाहूँगा:
std::function<int(int, int)> x1 = [=](int a, int b) -> int{return a + b;};
//usage
void set(std::function<int(int, int)> x);
std::function<int(int, int)> get();
और यह नहीं पता कि लैम्ब्डा फ़ंक्शन डेटा कैसे संग्रहीत किया जाता है।
मैं छेड़छाड़, स्मृति उपयोग और लैम्बडा फ़ंक्शन को तर्क या वापसी लैम्बडा फ़ंक्शन के रूप में पास करने का सबसे अच्छा तरीका जानने के लिए सबसे अच्छा तरीका जानना चाहता हूं।
यदि मैं लैम्ब्डा फ़ंक्शन ऑब्जेक्ट का आकार 4 से बड़ा है या त्रुटियों से बचने के लिए पॉइंटर्स का उपयोग करना पसंद करूंगा (अगर किसी प्रकार की कॉपी कन्स्ट्रक्टर निष्पादित की जाती है जब मैं एट्रिब्यूशन करता हूं या किसी प्रकार का विनाशक निष्पादित होता है जब मैं नहीं करता चाहते हैं)।
मुझे लैम्ब्डा फ़ंक्शन वेरिएबल्स कैसे घोषित करना चाहिए?
संपादित
मैं प्रतियां और चालें से बचना चाहते हैं, मैं एक ही समारोह फिर से उपयोग करने के लिए जारी रखना चाहते हैं।
मुझे इस उदाहरण को कैसे बदलना चाहिए?
int call1(std::function<int(int, int)> f){
return f(1, 2);
}
int call2(std::function<int(int, int)> f){
return f(4, 3);
}
std::function<int(int, int)>& recv(int s){
return [=](int a, int b) -> int{return a*b + s;};
}
int main(){
std::function<int(int, int)> f1, f2;
f1 = [=](int a, int b) -> int{return a + b;};
f2 = recv(10);
call1(f1);
call2(f1);
call1(f2);
call2(f2);
}
मैं वापस नहीं लौट सकते समारोह recv में संदर्भ:
warning: returning reference to temporary
यह एक अच्छा समाधान है?
int call1(std::function<int(int, int)>* f){
return (*f)(1, 2);
}
int call2(std::function<int(int, int)>* f){
return (*f)(4, 3);
}
std::function<int(int, int)>* recv(int s){
return new std::function<int(int, int)>([=](int a, int b) -> int{return a*b + s;});
}
int main(){
std::function<int(int, int)> f1 = [=](int a, int b) -> int{return a + b;};
std::function<int(int, int)> *f2 = recv(10);
call1(&f1);
call2(&f1);
call1(f2);
call2(f2);
delete f2;
}
संपादित करें (निष्कर्ष)
एक लैम्ब्डा समारोह वस्तु किसी भी वस्तु एक वर्ग के उदाहरण है कि तरह है। आवंटन, तर्क और विशेषता के नियम समान हैं।
"अगर मैं लैम्ब्डा फ़ंक्शन ऑब्जेक्ट का आकार 4 से बड़ा है तो मैं पॉइंटर्स का उपयोग करना पसंद करूंगा" क्यों? क्या आपको लगता है कि अगर 4 बाइट्स से बड़ा ऑब्जेक्ट उस पर है तो स्टैक फुल जाएगा? मानक सी ++ अभ्यास ऑब्जेक्ट को * डिफ़ॉल्ट * द्वारा स्टैक पर रखना है, जब तक कि आपके पास कोई अच्छा कारण न हो। और 4 बाइट से बड़ा होने वाला एक नहीं है। –