2013-04-22 28 views
5

मुझे केवल कुछ आदिम प्रकारों की अनुमति देने के लिए, टेम्पलेट वर्ग के अंदर एक विधि को विशेषज्ञता देने की आवश्यकता है (चाहते हैं)। (यह this का डुप्लिकेट सवाल नहीं है)टेम्पलेट वर्ग के अंदर टेम्पलेट विधि विशेषज्ञता

खैर मैं इस वर्ग मिल गया है:

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    X& get(const arg_type var); 
} 

मैं arg_type विशेषज्ञ केवल अहस्ताक्षरित पूर्णांकों, कुछ इस तरह की अनुमति देने के लिए करना चाहते हैं:

template<typename TYPE, size_t NB> template<unsigned long> X& X::get(const unsigned long val); 

लेकिन यकीन है कि, ऊपर काम नहीं करता है, न तो msvc2011 पर और न ही जीसीसी

अधिक विशिष्ट करने के लिए, मैं क्या करने की कोशिश टेम्प्लेटेड के आधार पर एक कोड लिखने के लिए है उपरोक्त टाइप करें, और विशेषज्ञता लिखें ताकि इस कक्षा एक्स का उपयोग करने वाले किसी भी व्यक्ति ने इस विधि का उपयोग किसी अन्य चीज़ के साथ नहीं किया हो।

क्या यह भी संभव है? और यदि यह है, तो ऐसा करना बुरा है?

अग्रिम धन्यवाद, jav974

+1

आपको क्यों लगता है कि नेस्टेड टेम्पलेट होना सबसे अच्छा तरीका है? जबकि आप यह काम कर सकते हैं, वहां क्लीनर सरल समाधान हो सकते हैं, जैसे नेस्टेड टेम्पलेट नहीं और केवल गैर-टेम्पलेट ओवरलोड ... –

उत्तर

4

एक विशेषज्ञता नहीं है कि आप क्या चाहते। एक विशेषज्ञता का उपयोग करके आप एक हस्ताक्षरित अभिन्न प्रकार का उपयोग कर अपने टेम्पलेट विधि के तत्कालता का इलाज करने के लिए एक विशेष तरीका प्रदान कर सकते हैं, लेकिन कुछ भी उपयोगकर्ता को इसे किसी अन्य प्रकार से तुरंत चालू करने से रोकता है।

आप का उपयोग कर कुछ SFINAE इस लक्ष्य को हासिल कर सकते हैं:

#include <type_traits>  

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    template<typename arg_type> 
    typename std::enable_if<std::is_unsigned<arg_type>::value, X&>::type // arg_type is unsigned 
    get(arg_type val) 
    { 

    } 
}; 

तुम भी static_assert इस्तेमाल कर सकते हैं, इसलिए है कि उपयोगकर्ताओं को एक और अधिक अनुकूल त्रुटि संदेश मिलता है:

template<typename arg_type> 
X& get(arg_type val) 
{ 
    static_assert(std::is_unsigned<arg_type>::value, "The argument should be unsigned!"); 
} 

आप के लिए TYPE टेम्पलेट पैरामीटर चाहते हैं उसी नियम का पालन करें, आप static_assert का उपयोग भी कर सकते हैं:

template<typename TYPE, size_t NB> 
class X 
{ 
public: 
    static_assert(std::is_unsigned<TYPE>::value, "TYPE should be unsigned!"); 
}; 
+0

बहुत बढ़िया !! मुझे इसके बारे में पता नहीं था, बहुत बहुत धन्यवाद !! जिस तरह से वर्ग के लिए 'प्रकार' को भी उसी नियम का पालन करना चाहिए, मुझे यह चेक कहां रखना चाहिए? सीटीओआर? – jav974

+0

@ jav974 मेरा संपादन देखें। – mfontanini

+0

धन्यवाद यह चट्टानों, मैं इसे हल चिह्नित! – jav974

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