मेरे पास एक ऐसा फ़ंक्शन है जो वर्तमान में विभिन्न डेटा प्रकारों के लिए अधिभारित है और उन डेटा प्रकारों को प्रारंभ करने के लिए लैम्ब्डा (फ़ंक्शन पॉइंटर) लेता है। मैं उन्हें टेम्पलेट उदाहरणों में बदलने की प्रक्रिया में हूं लेकिन अभी तक सफल नहीं हुआ हूं।विशेष फ़ंक्शन टेम्पलेट्स पर अधिभारित फ़ंक्शंस को कनवर्ट करें
Here's the overloaded version -
#include <iostream>
using namespace std;
void doSome(int (*func)(int &)){
int a;
a = 5;
int res = func(a);
cout << a << "\n";
}
void doSome(int (*func)(double &)){
double a;
a = 5.2;
int res = func(a);
cout << a << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
ध्यान दें कि मैं सरलीकरण के लिए int
और double
का उदाहरण लिया है, वे वास्तविक कोड में कुछ पूरी तरह से अलग (और जटिल) प्रकार हो सकता है।
#include <iostream>
using namespace std;
template <typename F, typename S>
void doSome(F &func){
S a;
auto res = func(a);
cout << res << "\n";
}
template<>
void doSome<typename F, int> (F &func){
int a;
a = 5;
auto res = func(a);
cout << res << "\n";
}
template<>
void dpSome<typename F, double> (F &func){
double a;
a = 5.5
auto res = func(a);
cout << res << "\n";
}
int main() {
doSome([](int &a){
a += 2;
return 1;
});
doSome([](double &a){
a += 2.5;
return 1;
});
return 0;
}
टेम्प्लेट काम करता है, लागू भी है, जबकि अगर मैं समारोह के लिए <any type hints>
पारित करने के लिए नहीं है, कि ज्यादा बेहतर समाधान होगा।
'टेम्पलेट <> शून्य doSome (एफ एंड समारोह)' गलत है, और यहां तक कि अगर आप 'टेम्पलेट शून्य doSome (एफ एंड समारोह)', आप आंशिक रूप से विशेषज्ञ नहीं कर सकते समारोह में लिखा है टेम्पलेट्स –
xinaiz
मैं सिर्फ उत्सुक हूं, आप ओवरलोडिंग से टेम्पलेट विशेषज्ञता में क्यों परिवर्तित करना चाहते हैं? अधिभार आमतौर पर फ़ंक्शन टेम्पलेट विशेषज्ञता से बेहतर और कम आश्चर्यजनक होता है। ओवरलोडिंग यही कारण है कि आपको फ़ंक्शन टेम्पलेट्स के लिए आंशिक विशेषज्ञता की आवश्यकता नहीं है। किसी के लिए मेरी सलाह जहां भी संभव हो फंक्शन टेम्पलेट्स विशेषज्ञता से बचने के लिए होगा। क्या यह संभव है कि यह एक एक्सवाई समस्या है? –
@NirFriedman फ़ंक्शन पॉइंटर्स केवल गैर-कैप्चरिंग लैम्बडास के लिए काम करते हैं, और यह बहुत सीमित है। 'std :: function' ने इसे हल कर लिया होगा और मैंने इसे हर जगह इस्तेमाल किया है लेकिन ये फ़ंक्शंस प्रदर्शन महत्वपूर्ण हैं और बेंचमार्क ने हमारे मामले में फ़ंक्शन पॉइंटर्स को बहुत तेज़ बताया है, इसलिए .. –