2011-04-21 19 views
6

मुझे आश्चर्य है कि मेरे मामले में कस्टम स्थितियों का उपयोग करके टेम्पलेट के लिए जनरेटिंग कोड को प्रतिबंधित करने का कोई तरीका है या नहीं, मैं केवल तभी काम करना चाहता हूं जब टेम्पलेट क्लास टी को क्लास बार द्वारा विरासत में मिला हो (ऐसा कुछ)टेम्पलेट क्लास प्रतिबंध

template <class T:public bar> void foo() 
{ 
    // do something 
} 
+3

आपको बूस्ट 'enable_if' उपयोग करने में सक्षम हो सकता है। –

+0

यदि आप सार्वजनिक विरासत से निपट रहे हैं, तो एक और तरीका है। मेरा जवाब देखें – iammilind

उत्तर

9

आप T हालांकि का उपयोग कर प्रतिबंधित कर सकते हैं "प्रतिस्थापन विफलता कोई त्रुटि नहीं है" (SFINAE):

template <typename T> 
typename std::enable_if<std::is_base_of<bar, T>::value>::type foo() 
{ 

} 

तो Tbar से प्राप्त नहीं है, समारोह टेम्पलेट की विशेषज्ञता असफल हो जायेगी और अधिभार संकल्प के दौरान इसे नहीं माना जाएगा। std::enable_if और std::is_base_of आने वाले संशोधन, सी ++ 0x में जोड़े गए सी ++ मानक पुस्तकालय के नए घटक हैं। यदि आपका कंपाइलर/मानक लाइब्रेरी कार्यान्वयन अभी तक उनका समर्थन नहीं करता है, तो आप उन्हें C++ TR1 या Boost.TypeTraits में भी ढूंढ सकते हैं।

+0

दरअसल, या यदि आपकी 'std' लाइब्रेरी में 'is_base_of' नहीं है, तो यह बूस्ट में है। –

+0

हाँ। बूस्ट समकक्ष 'boost :: enable_if > :: type' होगा; 'std :: enable_if'' bool' को अपना पहला तर्क मानता है जबकि 'boost :: enable_if' एक प्रकार लेता है। 'std :: enable_if'' boost :: enable_if_c' के बराबर है। –

+0

क्या आपको कोई विचार है कि std लाइब्रेरी ने enable_if या is_base_of कक्षाओं को कैसे कार्यान्वित किया है? – Ali1S232

0

हां, तकनीक का उपयोग किया जा सकता है (सार्वजनिक विरासत के लिए)। यह केवल एक सूचक प्रारंभिकरण का ऊपरी भाग होगा।

संपादित: पुनः लिख

template<typename Parent, typename Child> 
struct IsParentChild 
{ 
    static Parent* Check (Child *p) { return p; } 
    Parent* (*t_)(Child*); 
    IsParentChild() : t_(&Check) {} // function instantiation only 
}; 

template<typename T> 
void foo() 
{ 
    IsParentChild<Bar, T> check; 
// ... 
} 
संबंधित मुद्दे