मान लीजिए अगर मैं इस किया है,std :: function <R(T1,T2)> के साथ संगत फ़ंक्शन प्रकार के सेट को निर्धारित करने के नियम?
std::function<int(int,int)> fs;
तो मैं कैसे काम करता है (या समारोह वस्तुओं) जो fs
साथ प्रारंभ किया जा सकता है के सेट निर्धारित कर सकते हैं?
कौन सा folllowing की अनुमति दी है और नहीं जो:
std::function<int(int,int)> fs = [](int, int) { return int(10); };
std::function<int(int,int)> fs = [](char, char) { return char(10); };
std::function<int(int,int)> fs = [](int, short) { return int(10); };
std::function<int(int,int)> fs = [](double, int) { return float(10); };
std::function<int(int,int)> fs = [](int, wchar_t) { return wchar_t(10); };
std::function<int(int,int)> fs = [](const char*, int){ return "string"; };
std::function<int(int,int)> fs = [](const char*, int){ return 10; };
std::function<int(int,int)> fs = [](const char*, int){ return std::string(); };
बेशक
, मैं संकलन और देखो, जो एक ठीक संकलित कर सकते हैं और जो नहीं करता है। लेकिन यह मुझे पैरामीटर के प्रकार और रिटर्न प्रकार में बदलावों को समझने में मदद नहीं करता है। उनके लिए विभिन्न प्रकारों का उपयोग करने के लिए मैं कितनी दूर जा सकता हूं?
इसे दूसरे शब्दों में रखने के लिए, अगर मैंने कोई फ़ंक्शन (या फ़ंक्शन ऑब्जेक्ट) दिया है, तो मैं संकलन-समय पर कैसे निर्धारित कर सकता हूं यदि यह std::function<int(int,int)>
के साथ संगत है या नहीं? मुझे थोड़ा समझ है, लेकिन मुझे पर्याप्त विश्वास नहीं है।
तो कृपया std::function<R(T1,T2)>
के साथ संगत फ़ंक्शन प्रकार के सेट को निर्धारित करने के लिए नियमों को समझने और निकालने में मेरी सहायता करें? क्या मेटाप्रोग्रामिंग उपयोगकर्ताओं को सूचित करने के लिए यहां मेरी सहायता कर सकती है, अगर वे असंगत फ़ंक्शन का उपयोग करते हैं, तो अच्छा त्रुटि संदेश उत्पन्न करते हैं? , http://ideone.com/hJpG3
ऐसा लगता है कि यह उत्तर मानक लाइब्रेरी द्वारा प्रकट कार्यक्षमता के संदर्भ में है ... यदि मेरा उत्तर गलत है, तो क्या आप टिप्पणी कर सकते हैं? संपादित करें - यह विशेषता वापसी मान रूपांतरण को अनदेखा कर रही है ... – Potatoswatter
@Potatoswatter: मैंने अभी इन लक्षणों के कार्यान्वयन की समीक्षा की है। वे 'std :: forward',' std :: is_convertible' और 'std :: is_same' पर निर्भर करते हैं। उन्हें std :: lib या नहीं के हिस्से के रूप में कार्यान्वित किया जा सकता है।मैंने अपने जवाब की भी समीक्षा की है और यह नहीं देख रहा हूं कि मैंने कहां बताया कि आपका जवाब गलत है। मेरा जवाब बस आपके द्वारा संदर्भित अनुभागों का मेटाप्रोग्रामिंग कार्यान्वयन प्रदान करता है। ओपी ने मेटाप्रोग्रामिंग समाधान के बारे में पूछा, इसलिए मैंने सोचा कि मेरा जवाब प्रासंगिक है। रिटर्न वैल्यू रूपांतरण पर: यह '__invoke_of' और' is_convertible' का उपयोग कर '__callable' में शामिल है। –
ठीक है। एकमात्र असहमति यह होगी कि मैं अपनी प्रतिक्रिया को "पूर्व-पैक मानक जवाब" मानता हूं। रिटर्न प्रकार रूपांतरण के लिए, मैंने लिंक का पालन नहीं किया और माना कि यह एक गैर-सदस्य टेम्पलेट था, वांछित रिटर्न प्रकार तक पहुंच नहीं थी। उपयोगकर्ता स्तर पर, 'std :: is_convertible :: प्रकार, R> :: value' पर्याप्त नहीं है? मुझे लगता है कि यह निर्भर करता है कि आप SFINAE या 'false' परिणाम चाहते हैं। –
Potatoswatter