मैं एक टेम्पलेट वेक्टर प्रकार के साथ एक सरल गणित पुस्तकालय लिख रहा हूँ:साझा कार्यक्षमता के साथ कक्षा टेम्पलेट विशेषज्ञताओं
template<typename T, size_t N>
class Vector {
public:
Vector<T, N> &operator+=(Vector<T, N> const &other);
// ... more operators, functions ...
};
अब मैं विशेष रूप से इनमें से कुछ के लिए कुछ अतिरिक्त कार्यक्षमता चाहते हैं। मान लें कि मैं विशेष निर्देशांक तक पहुंचने के लिए Vector<T, 2>
पर x()
और y()
फ़ंक्शंस चाहता हूं। मैं इसके लिए आंशिक विशेषज्ञता बना सकता हूं:
template<typename T>
class Vector<T, 3> {
public:
Vector<T, 3> &operator+=(Vector<T, 3> const &other);
// ... and again all the operators and functions ...
T x() const;
T y() const;
};
लेकिन अब मैं जेनेरिक टेम्पलेट में पहले से मौजूद सब कुछ दोहरा रहा हूं।
मैं विरासत का भी उपयोग कर सकता हूं। VectorBase
के लिए सामान्य टेम्प्लेट का नाम बदल रहा है, मैं ऐसा कर सकता है:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
};
template<typename T>
class Vector<T, 3> : public VectorBase<T, 3> {
public:
T x() const;
T y() const;
};
हालांकि, अब समस्या यह है कि सभी ऑपरेटरों VectorBase
पर निर्धारित किए जाते हैं, तो वे VectorBase
उदाहरणों लौट आते हैं। ये Vector
चर करने के लिए आवंटित नहीं किया जा सकता:
Vector<float, 3> v;
Vector<float, 3> w;
w = 5 * v; // error: no conversion from VectorBase<float, 3> to Vector<float, 3>
मैं Vector
एक अंतर्निहित रूपांतरण निर्माता दे सकता है यह संभव बनाने के लिए:
template<typename T, size_t N>
class Vector : public VectorBase<T, N> {
public:
Vector(VectorBase<T, N> const &other);
};
हालांकि, अब मैं Vector
से VectorBase
और फिर से वापस करने के लिए परिवर्तित कर रहा हूँ। यद्यपि प्रकार स्मृति में समान हैं, और संकलक इसे सब कुछ अनुकूलित कर सकते हैं, यह कट्टरपंथी लगता है और मुझे वास्तव में एक संकलन-समय की समस्या के लिए संभावित रन-टाइम ओवरहेड नहीं होना पसंद है।
क्या इसे हल करने का कोई और तरीका है?
क्यों न केवल 'x() 'और' y() 'मुक्त फ़ंक्शन' वेक्टर 'के उचित विशेषज्ञता लेते हैं? जैसे 'टेम्पलेट टी एक्स (कॉन्स वेक्टर & v);' –
संभव है, लेकिन 'vx()' 'x (v) 'से अधिक समझ में आता है। इसके अलावा, मैं कुछ विशेष रचनाकारों को जोड़ना चाहता हूं, उदाहरण के लिए' वेक्टर (टी, टी) ', और कन्स्ट्रक्टर मुक्त फ़ंक्शंस नहीं हो सकते हैं। –
Thomas
नहीं, लेकिन आपके पास ऐसे कार्य हो सकते हैं जो' std :: make_pair' की शैली में ऑब्जेक्ट्स लौटाते हैं। –