मैं सी ++ 11 कार्यात्मक सुविधाओं के साथ खेल रहा हूं। एक चीज जो मुझे अजीब लगता है वह यह है कि लैम्ब्डा फ़ंक्शन का प्रकार वास्तव में <> प्रकार नहीं है। और क्या है, लैम्ब्डा टाइप-इनफ्रेंसिंग तंत्र के साथ वास्तव में अच्छी तरह से खेलना प्रतीत नहीं होता है।C++ 11 में लैम्ब्डा फ़ंक्शन क्यों कार्य नहीं करते <> प्रकार?
संलग्न एक छोटा सा उदाहरण है, जिसमें मैं दो पूर्णांकों जोड़ने के लिए एक समारोह के दो तर्क flipping का परीक्षण किया है। (संकलक मैं इस्तेमाल किया MinGW के तहत जीसीसी 4.6.2 था।) उदाहरण में, addInt_f
के लिए प्रकार स्पष्ट रूप से समारोह <> का उपयोग करते समय addInt_l
एक लैम्ब्डा जिसका प्रकार auto
साथ टाइप-inferenced है परिभाषित किया गया है।
जब मैं कोड संकलित, flip
समारोह addInt की स्पष्ट रूप से परिभाषित टाइप संस्करण नहीं बल्कि लैम्ब्डा संस्करण स्वीकार कर सकते हैं, कह रही है कि, testCppBind.cpp:15:27: error: no matching function for call to 'flip(<lambda(int, int)>&)'
कि लैम्ब्डा संस्करण को दिखाने में कोई त्रुटि दे रही है (साथ ही 'कच्चा' संस्करण) स्वीकार किया जा सकता है अगर यह स्पष्ट रूप से उपयुक्त फ़ंक्शन <> प्रकार पर डाला गया है।
तो मेरी प्रश्न हैं:
क्यों यह एक लैम्ब्डा समारोह पहली जगह में एक
function<>
प्रकार नहीं है कि है? छोटे उदाहरण में,addInt_l
मेंfunction<int (int,int)>
क्यों भिन्न,lambda
प्रकार के बजाय प्रकार के रूप में नहीं है? कार्यात्मक प्रोग्रामिंग के परिप्रेक्ष्य से, फ़ंक्शन/कार्यात्मक वस्तु और लैम्ब्डा के बीच क्या अंतर है?अगर वहाँ एक मौलिक कारण इन दो अलग अलग होना जरूरी है। मैंने सुना है कि लैम्ब्डा को
function<>
में परिवर्तित किया जा सकता है लेकिन वे अलग हैं। क्या यह सी ++ 11 का एक डिज़ाइन मुद्दा/दोष है, एक कार्यान्वयन मुद्दा है या क्या दोनों को इस तरह से अलग करने में कोई लाभ है? ऐसा लगता है किaddInt_l
के प्रकार-हस्ताक्षर ने पैरामीटर के पैरामीटर और रिटर्न प्रकारों के बारे में पर्याप्त जानकारी प्रदान की है।वहाँ एक रास्ता तो यह है कि ऊपर उल्लेख किया है स्पष्ट प्रकार कास्टिंग बचा जा सकता है लैम्ब्डा लिखने के लिए है?
अग्रिम धन्यवाद।
//-- testCppBind.cpp --
#include <functional>
using namespace std;
using namespace std::placeholders;
template <typename T1,typename T2, typename T3>
function<T3 (T2, T1)> flip(function<T3 (T1, T2)> f) { return bind(f,_2,_1);}
function<int (int,int)> addInt_f = [](int a,int b) -> int { return a + b;};
auto addInt_l = [](int a,int b) -> int { return a + b;};
int addInt0(int a, int b) { return a+b;}
int main() {
auto ff = flip(addInt_f); //ok
auto ff1 = flip(addInt_l); //not ok
auto ff2 = flip((function<int (int,int)>)addInt_l); //ok
auto ff3 = flip((function<int (int,int)>)addInt0); //ok
return 0;
}
आपको 'std :: function' तर्क नहीं लेना चाहिए, मुख्य रूप से क्योंकि यह प्रकार की कटौती को रोकता है (जो आपकी समस्या है)। –
संबंधित: [सी ++ 11 टाइप नहीं करता है जब std :: function या lambda फ़ंक्शन शामिल होते हैं] (http://stackoverflow.com/q/9998402/487781) – hardmath
लैम्बडास अज्ञात फ़ंक्शंस में परिवर्तित हो जाते हैं (या फ़ंक्शन यदि वे पर्यावरण पर कब्जा न करें)। उन्हें std :: फ़ंक्शन में बदलने से भाषा और पुस्तकालय के बीच एक मजबूत युग्मन शुरू हो जाएगा और इसलिए यह एक बहुत बुरा विचार होगा। – MFH