Factory method returning an concrete instantiation of a C++ template class -


मेरे पास एक वर्ग है

  टेम्पलेट & lt; अहस्ताक्षरित int N & gt; कक्षा StaticVector {// सामान};  

मैं कैसे इस वर्ग में घोषित और परिभाषित कर सकता हूं एक स्थैतिक कारखाना विधि जिसे एक स्टैटिक वेक्टर & lt; 3> ऑब्जेक्ट, STH जैसे

  StaticVector & lt; 3 & gt; Create3dVec (डबल एक्स 1, डबल एक्स 2, डबल एक्स 2);  

?

"मैं इसे कैसे घोषित और परिभाषित कर सकता / सकती हूं? वर्ग "

किस वर्ग में? आपने क्लास टेम्प्लेट परिभाषित किया है, न कि क्लास। आप एक क्लास टेम्प्लेट के एक स्थिर फ़ंक्शन को कॉल नहीं कर सकते हैं, आपको स्टैटिक फ़ंक्शन के एक विशिष्ट संस्करण को कॉल करना है जो कि एक वास्तविक वर्ग का हिस्सा है।

अतः, क्या आप टेम्पलेट चाहते हैं (और इसलिए इसे चालू करने के लिए) एक स्टैटिक वेक्टर & lt; 3 & gt; लौटाए जाने वाले फ़ंक्शन को प्राप्त करने के लिए या क्या आप चाहते हैं कि एक टेम्पलेट के एक विशेष त्वरण को एक स्टैटिक वेक्टर & lt; 3 & gt;?

लौटाए जाने के लिए फ़ंक्शन करना है:

  टेम्पलेट & lt; अहस्ताक्षरित int N & gt; स्ट्रेट SV {int सामग्री [एन]; स्थिर एसवी & lt; 3 & gt; Get3dVec (int x, int y, int z) {एसवी & lt; 3 & gt; v; V.contents [0] = x; V.contents [1] = y; V.contents [2] = z; वापसी वी; }}; Int main () {एसवी & lt; 3 & gt; V = SV & lt; 1 & gt; :: get3dVec (1,2,3); }  

मेरे लिए काम करता है।

अगर बाद में (आप केवल 3dVec को एसवी & lt; 3 & gt ;, सभी एसवी & lt; whatever & gt; तो आप टेम्पलेट विशेषज्ञ चाहते हैं:

  टेम्पलेट & lt; अहस्ताक्षरित int N & gt; स्ट्रेट SV {int सामग्री [एन]; }; टेम्पलेट के & lt; & gt; स्ट्रेट SV & lt; 3 & gt; {Int सामग्री [3]; // को स्पेशलाइजेशन स्थिर एसवी & lt; 3 & gt; में पुन: घोषित किया जाना चाहिए। Get3dVec (int x, int y, int z) {एसवी & lt; 3 & gt; v; V.contents [0] = x; V.contents [1] = y; V.contents [2] = z; वापसी वी; }}; Int main () {एसवी & lt; 3 & gt; V = SV & lt; 1 & gt; :: get3dVec (1,2,3); // संकलन त्रुटि SV & lt; 3 & gt; V = SV & lt; 3 & gt; :: get3dVec (1,2,3); // ओके}  

यदि कॉलिंग कोड मूलभूत रूप से अप्रासंगिक टेम्प्लेट पैरामीटर को छोड़कर अच्छा बनाने की तुलना में किसी अन्य कारण के लिए नहीं है, तो मैं ईराइबिलांजा से सहमत हूं कि सामान्य रूप से एक नि: शुल्क कार्य (नाम स्थान में अगर आप फिर से उपयोग के लिए लिख रहे हैं) इस उदाहरण के लिए और अधिक समझ जाएगा।

सी ++ टेम्पलेट्स का अर्थ है कि आपको जावा में करते समय सी ++ में जितना ज्यादा स्थिर कार्य की आवश्यकता नहीं होती है: अगर आप "फू" फ़ंक्शन चाहते हैं जो क्लास बार के लिए एक चीज और क्लास बाज़ के लिए दूसरी बात करता है, आप इसे एक टेम्पलेट पैरामीटर के साथ एक फ़ंक्शन टेम्पलेट के रूप में घोषित कर सकते हैं जो बार या बाज़ (और जो फ़ंक्शन मापदंडों से अनुमान लगाया जा सकता है या नहीं) हो सकता है, यह प्रत्येक वर्ग पर एक स्थिर फ़ंक्शन बनाने के बजाय, लेकिन अगर आप चाहते हैं कि यह एक स्थिर कार्य हो, तो आपको इसे एक विशिष्ट वर्ग का उपयोग करके कॉल करना होगा, न कि केवल एक टेम्पलेट नाम।


Comments