में सुरुचिपूर्ण ऑपरेटर ओवरलोडिंग थोड़ी देर के लिए मैं डी ऑपरेटर ओवरलोडिंग की दिशा के बारे में उलझन में था, लेकिन अब मुझे एहसास है कि यह एक सुंदर प्रणाली है ... अगर यह केवल कोर प्रकारों (int, float, आदि) के साथ काम करेगी। अनुवर्ती कोड पर विचार करें: के रूप में यह सब overloadsडी
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
इस खूबसूरत कोड अगर यह काम हो सकता है, देखकर + =, - =, * =, आदि .. एक विधि में ऑपरेटरों। हालांकि, जैसा कि आप देख सकते हैं, यह बॉक्स से बाहर काम नहीं करता है। मैं एक समाधान बनाया है का उपयोग कर टेम्पलेट्स (भगवान मैं डी प्यार):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
Op!(op, typeof(X)).Assign(X, vector.X);
Op!(op, typeof(Y)).Assign(Y, vector.Y);
}
}
यह केवल मैं चाहते ज्यादा "घर में" सब कुछ रखना पसंद करते हैं ठीक है। क्या इस काम को टेम्पलेट की सहायता के बिना बनाने का कोई तरीका है? मुझे पता है कि मैं यहाँ चुनौतीपूर्ण हूं, क्योंकि कोई प्रदर्शन हानि नहीं है और स्थिति में मॉड्यूल आयात करना मुश्किल नहीं है, मुझे ऐसा करने की ज़रूरत है। मैं बस सोच रहा हूं कि यह बनाया गया है और मैं कुछ दिख रहा हूं।
ध्यान दें कि 'स्थिर if'' 'else' के बाद if's निम्नलिखित के लिए जारी रखा नहीं है:
क्या आप यहाँ करने के लिए कोशिश कर रहे हैं कि क्या करना है विहित रास्ता स्ट्रिंग mixins उपयोग करने के लिए है। आपको फिर से 'स्थैतिक' दोहराना होगा। – Bolpat