2012-12-25 41 views
9

मान लीजिए कि मैं सीमा को लागू करना चाहता हूं कि टेम्पलेट पैरामीटर फू में एक बच्चा है।टेम्पलेट पैरामीटर पर बाल-एक्स-एक्स सीमा को कैसे लागू करें?

वहाँ प्रकार- लक्षण के माध्यम से इस लागू करने के लिए कोई तरीका है? एक संकलन-समय static_assert विफलता बहुत अच्छी होगी।

नीचे दिए गए कोड में, आइए इसे दो भाग (अलग) प्रश्न बनाएं।

  1. संकलन के लिए केवल My_Limited_Template<Bar> को अनुमति दें।
  2. संकलन के लिए केवल My_Limited_Template<TBar> को अनुमति दें।

संपादित मुझे बुरा नामकरण के लिए माफी माँगता हूँ: TBar और TBaz उद्देश्यों पर गैर टेम्पलेट वर्गों के लिए हैं। मैं सिर्फ भाग में नाम वर्गों से स्पष्ट करने के लिए के सामने टी संलग्न 1.

कोड

struct Foo { };    // no 
struct Bar : public Foo { }; // yes 
struct Baz { };    // no 

template< typename T > 
struct TFoo { };      // no 
struct TBar : public TFoo<TBar> { }; // yes 
struct TBaz { };      // no 

template< typename T > 
struct My_Limited_Template 
{ 
    // Part One: 
    // My_Limited_Template<Foo> // disallow 
    // My_Limited_Template<Bar> // allow 
    // My_Limited_Template<Baz> // disallow 
    // 
    // Part Two: 
    // My_Limited_Template<TFoo<int>> // disallow 
    // My_Limited_Template<TBar>  // allow 
    // My_Limited_Template<TBaz>  // disallow 
}; 
+1

तो दूसरा भाग * "केवल पैरामीटर को अनुमति देगा जो सीआरटीपी का उपयोग कर टीएफयू से प्राप्त किए गए हैं" *? – jrok

+0

@jrok +1 यदि आप सीआरटीपी शामिल कर सकते हैं, तो यह भी बेहतर होगा, लेकिन मुझे यकीन नहीं है कि यह संभव है! – kfmfe04

+0

मेरा मतलब यह था कि ** आपने ** टीबीआर प्राप्त करते समय सीआरटीपी का इस्तेमाल किया था। क्या यह एकमात्र प्रकार का 'टीएफयू' बच्चा है जिसे आप अनुमति देना चाहते हैं या क्या यह 'स्ट्रक्चर एक्स: टीएफयू {};' जैसे कुछ होना ठीक है? – jrok

उत्तर

1

मुझे लगता है कि आप TBar और TBas की परिभाषा में कोई त्रुटि की, कि मेरी संशोधन की जाँच सही है।

#include <type_traits>  

struct Foo { };    // don't allow this 
struct Bar : public Foo { }; // allow this 
struct Baz { };    // don't allow this 

template< typename T > struct TFoo { };      
template< typename T > struct TBar : public TFoo<TBar<T>> { }; 
template< typename T > struct TBaz { };      

template< typename T > 
struct My_Limited_Template 
{ 
     static_assert(
       (std::is_base_of<Foo,T>::value && !std::is_same<T,Foo>::value) 
       || 
       (std::is_base_of<TFoo<T>,T>::value && !std::is_same<T,TFoo<T>>::value), 
       "fail2" 
     ); 
}; 
+1

मुझे नहीं लगता कि आपका दूसरा हिस्सा सही है (आप क्यों मान रहे हैं कि प्रश्न गलत है?)। IIUC, प्रश्न के लिए आवश्यक है कि 'टी'' TFoo' के कुछ (अनिर्दिष्ट) तत्कालता का उप-वर्ग हो, जबकि आपके उत्तर की आवश्यकता है कि 'टी' विशेष रूप से' TFoo 'का उप-वर्ग हो। – Mankarse