2009-07-22 13 views
10

क्या विशिष्ट टेम्पलेट वर्ग में गैर-प्रकार के टेम्पलेट पैरामीटर के मानों तक पहुंच बनाना संभव है?क्या विशिष्ट टेम्पलेट वर्ग में गैर-प्रकार के टेम्पलेट पैरामीटर के मानों तक पहुंच बनाना संभव है?

अगर मैं विशेषज्ञता के साथ टेम्पलेट वर्ग है:

template <int major, int minor> struct A { 
     void f() { cout << major << endl; } 
    } 

    template <> struct A<4,0> { 
     void f() { cout << ??? << endl; } 
    } 

मैं इसे उपरोक्त मामले पता है कि यह मान 4 और 0 के बजाय वेरिएबल का उपयोग करके लेकिन क्या मैं एक बड़े वर्ग है कि मैं कर रहा हूँ विशेषज्ञता है हार्डकोड करने के लिए सरल है और मैं मूल्यों तक पहुंचने में सक्षम होना चाहता हूं।

यह major और minor मानों तक पहुंच (4 और 0) संभव है एक < 4,0 में>? या मैं उन्हें स्थिरांक के रूप में टेम्पलेट इन्स्टेन्शियशन पर आवंटित करने के लिए है:

template <> struct A<4,0> { 
     static const int major = 4; 
     static const int minor = 0; 
     ... 
    } 
+0

यदि आप मूल्यों के आधार पर विशेषज्ञता प्राप्त कर रहे हैं तो इसका तात्पर्य है कि उन विशेष मूल्यों के बारे में कुछ खास है। यदि आप उन्हें टेम्पलेट में सामान्य मानों के रूप में उपयोग कर रहे हैं और केवल कुछ स्थानों में उन्हें विशेष रूप से इलाज कर रहे हैं, तो हो सकता है कि आप विशेष व्यवहार को एक छोटे से विशिष्ट वर्ग टेम्पलेट में संक्षिप्त कर सकें, जिससे बड़े टेम्पलेट को पूरी तरह से सामान्य और अनसुलझा के रूप में छोड़ दिया जा सके। यह कहना मुश्किल है कि क्या आप अपने प्रश्न को और अधिक 'वास्तविक' के रूप में विस्तारित कर सकते हैं? –

+0

मुझे लगता है कि सवाल काफी वास्तविक है। मेरे पास मौजूदा बेस क्लास है जो प्रोटोकॉल संस्करण के आधार पर विशिष्ट व्यवहार लागू करता है। पहले इसमें एक सदस्य था जो प्रोटोकॉल संस्करण लौटाता था - क्योंकि वह सदस्य अब उपलब्ध नहीं था वहां एक लॉगिंग विधि थी जिसमें आउटपुट में प्रोटोकॉल संस्करण शामिल था। मैं सिर्फ मूल्यों को हार्डकोड कर सकता था लेकिन मैं जानना चाहता था कि क्या बेहतर तरीका है या नहीं। स्वीकार्य उत्तर इसे करने का अच्छा तरीका प्रदान करता है - मैं वास्तव में अन्य स्थानों में इसी तरह के लक्षणों का उपयोग कर रहा हूं - पैरामीटर प्रकार प्राप्त करने के लिए, लेकिन इरादा वही है। – stefanB

उत्तर

16

इस तरह की समस्या हल हो सकती हैं "लक्षण" structs का एक अलग सेट होने के द्वारा।

// A default Traits class has no information 
template<class T> struct Traits 
{ 
}; 

// A convenient way to get the Traits of the type of a given value without 
// having to explicitly write out the type 
template<typename T> Traits<T> GetTraits(const T&) 
{ 
    return Traits<T>(); 
} 

template <int major, int minor> struct A 
{ 
    void f() 
    { 
     cout << major << endl; 
    } 
}; 

// Specialisation of the traits for any A<int, int> 
template<int N1, int N2> struct Traits<A<N1, N2> > 
{ 
    enum { major = N1, minor = N2 }; 
}; 

template <> struct A<4,0> 
{  
    void f() 
    { 
     cout << GetTraits(*this).major << endl; 
    } 
}; 
+0

+1 अच्छा, धन्यवाद – stefanB

1

नहीं वास्तव में अपने प्रश्न का उत्तर, लेकिन आप उन्हें, अर्थात् गणना कर सकते हैं:

enum{ 
specialisationMajor=4, 
specialisationMinor=0 
}; 

template <> struct A<specialisationMajor,specialisationMinor> { 
    static const int major = specialisationMajor; 
    static const int minor = specialisationMinor; 
    ... 
} 
+0

मैं चर के दूसरे सेट को परिभाषित करने से बचने की कोशिश कर रहा हूं ... वह टेम्पलेट पैरामीटर रखने की सुंदरता थी, मैं आमतौर पर मानों तक पहुंच नहीं चाहता ... लेकिन कभी नहीं, लेकिन धन्यवाद – stefanB

संबंधित मुद्दे