शामिल कर रहे हैं जब मैं इस समारोह को परिभाषित,सी ++ 11 प्रकार अनुमान नहीं है जब std :: समारोह या लैम्ब्डा कार्यों
template<class A>
set<A> test(const set<A>& input) {
return input;
}
मैं इसे कोड में कहीं test(mySet)
का उपयोग कर स्पष्ट रूप से परिभाषित करने के लिए बिना कॉल कर सकते हैं टेम्पलेट प्रकार। हालांकि, जब मैं निम्नलिखित समारोह का उपयोग करें:
template<class A>
set<A> filter(const set<A>& input,function<bool(A)> compare) {
set<A> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret.insert(*it);
}
}
return ret;
}
जब मैं इस समारोह का उपयोग कर फोन filter(mySet,[](int i) { return i%2==0; });
मैं निम्नलिखित त्रुटि मिलती है:
error: no matching function for call to ‘filter(std::set&, main()::)’
हालांकि, इन संस्करणों के सभी काम करते हैं:
std::function<bool(int)> func = [](int i) { return i%2 ==0; };
set<int> myNewSet = filter(mySet,func);
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
set<int> myNewSet = filter(mySet,function<bool(int)>([](int i){return i%2==0;}));
सी ++ 11 टेम्पलेट प्रकार का अनुमान लगाने में असमर्थ क्यों है जब मैं लैम्ब्डा फ़ंक्शन डायरेक्ट डालता हूं अभिव्यक्ति के अंदर y std::function
सीधे बनाये बिना?
संपादित करें:
टिप्पणी में प्रति ल्यूक डेंटन की सलाह, यहाँ समारोह मैंने पहले किया था कि स्पष्ट रूप से पारित होने के लिए टेम्पलेट्स की जरूरत नहीं है के लिए एक विकल्प है।
template<class A,class CompareFunction>
set<A> filter(const set<A>& input,CompareFunction compare) {
set<A> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret.insert(*it);
}
}
return ret;
}
इसे टेम्पलेट की आवश्यकता के बिना set<int> result = filter(myIntSet,[](int i) { i % 2 == 0; });
द्वारा बुलाया जा सकता है।
कंपाइलर नए अस्वीकरण कीवर्ड का उपयोग करके और नए फ़ंक्शन रिटर्न प्रकार सिंटैक्स का उपयोग करके कुछ हद तक रिटर्न प्रकार का अनुमान लगा सकता है।
template<class Value,class CompareType,class IndexType>
auto filter(const set<Value>& input,CompareType compare,IndexType index) -> map<decltype(index(*(input.begin()))),Value> {
map<decltype(index(*(input.begin()))),Value> ret;
for(auto it = input.begin(); it != input.end(); it++) {
if(compare(*it)) {
ret[index(*it)] = *it;
}
}
return ret;
}
यह भी टेम्पलेट सीधे का उपयोग किए बिना कहा जा सकता है,
के रूप में: यहाँ एक उदाहरण है कि एक नक्शा करने के लिए एक सेट बदल देता है, एक छानने समारोह और एक समारोह है कि मूल्यों पर आधारित कुंजी उत्पन्न करता है उपयोग कर रहा हैmap<string,int> s = filter(myIntSet,[](int i) { return i%2==0; },[](int i) { return toString(i); });
आपके प्रश्न से संबंधित नहीं है, लेकिन आपको पता है कि आपका 'फ़िल्टर' अनिवार्य रूप से 'std :: copy_if' के गैर-सामान्य संस्करण के बराबर है, है ना? –
आह, मुझे std :: copy_if के बारे में पता नहीं था, इसे इंगित करने के लिए धन्यवाद। हालांकि, यह 4 कार्यों के एक बड़े समूह का हिस्सा है, जो फ़िल्टरिंग करते समय सेट => मानचित्र को परिवर्तित करता है और मुझे इसे कॉपी करने के लिए एक तरीका नहीं दिखता है और सेट में मानों का उपयोग करके उपयोगकर्ता को कुंजी बनाने की अनुमति देता है। उपयोग में स्थिरता के लिए, मैं इसे इस तरह से करने का विकल्प चुन रहा हूं। – Datalore
रिकॉर्ड के लिए, यदि आप एक मज़ेदार को स्वीकार करना चाहते हैं तो यह आमतौर पर एक सामान्य टेम्पलेट पैरामीटर बनाने के लिए बेवकूफ है, यानी 'टेम्पलेट <टाइपनाम ए, टाइपनाम नाम> सेट फ़िल्टर (सेट कॉन्स्ट एंड इनपुट, पूर्वानुमान की तुलना करें); '। जैसा कि आपने अभी देखा है, 'std :: function' दस्तावेज़ में काम नहीं करता है कि पारित भविष्य में हस्ताक्षर मिलान' बूल (ए) 'होना चाहिए; ऐसा करने के अन्य तरीके हैं। इसके अलावा फ़ंक्शन तर्क के रूप में 'std :: function' का उपयोग करने में * अन्य * नुकसान हैं। –