जब मैं एक टेम्पलेट वर्ग में एक (स्थिर) सदस्य फ़ंक्शन/स्थिरता का विशेषज्ञ हूं, तो मैं इस बात से उलझन में हूं कि घोषणा कहां है।टेम्पलेट क्लास सदस्य विशेषज्ञता की घोषणा
यहाँ मैं क्या क्या करना है, इसका एक उदाहरण - IBM's reference on template specialization से सीधे yoinked:
=== आईबीएम सदस्य विशेषज्ञता उदाहरण ===
template<class T> class X {
public:
static T v;
static void f(T);
};
template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }
template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }
int main() {
X<char*> a, b;
X<float> c;
c.f(10); // X<float>::v now set to 20
}
सवाल यह है कि, मैं कैसे इस में विभाजित है हेडर/सीपीपी फाइलें? सामान्य कार्यान्वयन स्पष्ट रूप से शीर्षलेख में है, लेकिन विशेषज्ञता के बारे में क्या है?
यह हेडर फ़ाइल में नहीं जा सकता है, क्योंकि यह ठोस है, जिससे कई परिभाषाएं होती हैं। लेकिन अगर यह .cpp फ़ाइल में जाता है, तो वह कोड है जो एक्स :: एफ() को विशेषज्ञता के बारे में जानता है, या यह सामान्य एक्स :: एफ() पर भरोसा कर सकता है?
अब तक मुझे केवल .cpp में विशेषज्ञता प्राप्त हुई है, जिसमें शीर्षलेख में कोई घोषणा नहीं है। मुझे संकलन या यहां तक कि मेरे कोड को चलाने में समस्या नहीं है (जीसीसी पर, इस समय संस्करण को याद न करें), और यह अपेक्षित व्यवहार करता है - विशेषज्ञता को पहचानना। लेकिन ए) मुझे यकीन नहीं है कि यह सही है, और मैं जानना चाहता हूं कि क्या है, और बी) मेरे डॉक्सिजन दस्तावेज भयानक और बहुत भ्रामक हैं (उस पर
में एक पल
बाद में एक प्रश्न)।
क्या, कुछ इस तरह होगा मेरे लिए सबसे प्राकृतिक लगता है शीर्षक में विशेषज्ञता की घोषणा और सीपीपी में यह परिभाषित करने:
=== XClass.hpp ===
#ifndef XCLASS_HPP
#define XCLASS_HPP
template<class T> class X {
public:
static T v;
static void f(T);
};
template<class T> T X<T>::v = 0;
template<class T> void X<T>::f(T arg) { v = arg; }
/* declaration of specialized functions */
template<> char* X<char*>::v;
template<> void X<float>::f(float arg);
#endif
=== XClass.cpp ===
#include <XClass.hpp>
/* concrete implementation of specialized functions */
template<> char* X<char*>::v = "Hello";
template<> void X<float>::f(float arg) { v = arg * 2; }
... लेकिन मैं अगर यह सही है पता नहीं है। कोई विचार?
प्रश्न, जिज्ञासा से बाहर: क्यों इनलाइनिंग के लिए प्राथमिकता? यह लागू करने के लिए एक अजीब "आवश्यकता" प्रतीत होता है - कि "डिफ़ॉल्ट रूप से" एक टेम्पलेट विशेषज्ञता को रेखांकित किया जाएगा। मैं ये सब केवल इसलिए पूछता हूं क्योंकि आप यह कहते हैं कि आप "आमतौर पर" करते हैं, और मुझे नहीं लगता कि मैं आमतौर पर ऐसा क्यों करना चाहता हूं कि मैं आमतौर पर किसी भी अन्य फ़ंक्शन इनलाइन की घोषणा करना चाहता हूं। – Ziv
हेडर में डालने की प्राथमिकता के बारे में, 'इनलाइन' एक साइड इफेक्ट है। लिखने के लिए कम, अधिक अनुकूलन अवसर, एक घोषणा भूलकर कोई त्रुटि नहीं। इसके अलावा आपको हमेशा पूरी तरह से विशेषज्ञता की आवश्यकता होती है और अधिकांश टेम्पलेट्स के लिए इसका मतलब है कि प्रत्येक संयोजन के लिए एक स्पष्ट घोषणा और तत्कालता का उपयोग किया जाता है। सामान्यता के इरादे को पराजित करने की तरह, है ना? –
ठीक है, ज़ाहिर है, मैं केवल उन मामलों के बारे में बात कर रहा हूं जब एक पूर्ण विशेषज्ञता वांछित है, अन्यथा यह स्पष्ट रूप से एक पूरी कहानी है ... प्रश्न को फ्लिप करें, फिर: वे वही फायदे क्यों नहीं होंगे जो आम तौर पर हमें पसंद करते हैं सभी कार्यों को इनलाइन लिखें? – Ziv