में प्रतिनिधि/फ़ंक्शन और इंटरफ़ेस को इंटरचेंज करना मैं एक फ़ंक्शन को परिभाषित करने में सक्षम होना चाहता हूं जो इंटरफ़ेस लेता है, लेकिन एक प्रतिनिधि या फ़ंक्शन के साथ पूरा किया जा सकता है जो समान कार्यक्षमता प्रदान करता है। उदाहरण के लिए, C++ मैं की तरह कुछ लिख सकते हैं:डी 2
typedef std::function<int (float)> toInt;
void fun(toInt dg) { ... }
struct impl1 {
int operator()(float x) { ... }
};
int impl2(float x) { ... }
और फिर या तो कार्यान्वयन का उपयोग कर इसे कहते हैं:
fun(impl1());
fun(&impl2);
(यह float-> पूर्णांक रूपांतरण सिद्धांत को वर्णन करने के लिए सिर्फ एक सरल उदाहरण है, मेरी वास्तविक कार्यक्षमता नहीं)।
मैं डी में कुछ इसी तरह मेरे अनुभवहीन प्रयास इस तरह से चला गया प्राप्त करने के लिए करना चाहते हैं:
interface toInt {
int opCall(float);
}
void fun(toInt dg) { ... }
int impl2(float x) { ... }
fun(impl2);
संकलक इस अंतिम पंक्ति है कि यह परोक्ष toInt प्रकार के impl2 परिवर्तित नहीं कर सकते पर शिकायत। मैं शायद मज़ेदार ओवरलोडेड कार्यान्वयन को जोड़ सकता हूं और रूपांतरण को स्पष्ट कर सकता हूं, लेकिन मैं सोच रहा था कि ऐसा करने का एक और अधिक सुरुचिपूर्ण और सामान्य तरीका है, जैसा उपरोक्त सी ++ उदाहरण में है।
नौसिखिया की मदद के लिए धन्यवाद :) यह सबसे व्यावहारिक समाधान की तरह लगता है। यह कॉलर के परिप्रेक्ष्य से संकेत की अतिरिक्त परत जोड़ता है: आप केवल f (x) की बजाय मजेदार (x, f) को कॉल कर रहे हैं, जैसा कि std :: function के साथ होगा। मैंने std.curry के साथ इसे ठीक करने की कोशिश की! (मज़ेदार() के लिए पैरामीटर ऑर्डर को उलटाना और उपनाम करी का उपयोग करना! (मजेदार, एक्स) fun1; fun1 (0.0);), लेकिन कंपाइलर खुश नहीं है: त्रुटि: "टेम्पलेट tst.main.curry! (मजेदार, एक्स) .curry (टी) अगर (है (टाइप (मजेदार (तर्क, T.init)))) किसी भी समारोह टेम्पलेट घोषणा से मेल नहीं खाता "(टेम्पलेट तर्क को कम नहीं कर सकता)। – Eitan
मैं इसे [कोड] उपनाम करी का उपयोग करके काम करने में सक्षम था! (मजेदार! Impl1, x) funX; funX (4.4); [/ कोड] यहां मुद्दा यह है कि 'करी' से पहले टेम्पलेट 'मज़े' को फ़ंक्शन 'मजेदार' में विस्तारित करने की आवश्यकता है, इसके बारे में जानता है कि इसके साथ कैसे काम करना है। यह शायद एक आम पर्याप्त परिदृश्य है कि इसे stdlib में जोड़ा जाना चाहिए, हालांकि। बेशक आप इसे [कोड] उपनाम करी का उपयोग करके अधिक सामान्य बना सकते हैं! (मजेदार! (टाइपोफ (एक्स)), एक्स) funX; [/ कोड] ताकि आपको उपभोक्ता को करी करने के लिए पूरे, संभवतः जटिल, x का प्रकार दोहराना पड़े। –