2011-02-22 16 views
9

से विरासत में मिला है, मैं यह जांचना चाहता हूं कि टेम्पलेट को दिया गया प्रकार मेरी प्रोजेक्ट में बेस क्लास से विरासत में मिला है या नहीं। ,जांचें कि क्या टेम्पलेट तर्क क्लास

template< class T : public CBaseClass > 
  • यह टेम्पलेट्स के साथ ऐसा करना संभव है यदि नहीं, तो मैं इसे और कैसे कर सकते हैं:

    ऐसा लगता है कि एक निम्न उदाहरण से यह उम्मीद करेंगे काम करना चाहिए?

+0

चेक http://stackoverflow.com/questions/4532281/how-to-test-whether-class-b-is-derived-from- कक्षा - –

उत्तर

10

आप बूस्ट से boost::is_base_and_derived का उपयोग कर सकते हैं, BOOST_STATIC_ASSERT के साथ संयुक्त। यदि आप TR1 या C++ 0x समर्थन के साथ एक कंपाइलर का उपयोग कर रहे हैं, तो मानक लाइब्रेरी में उन संरचनाओं के समकक्ष हैं (std::is_base_of, और static_assert सी ++ 0x में कथन)।

+0

मुझे बूस्ट का उपयोग करने की अनुमति नहीं है, दुर्भाग्य से – Oktstrom

+1

@Oktstrom: आप किस कंपाइलर का उपयोग कर रहे हैं? क्या यह TR1 या C++ 0x का समर्थन करता है? –

+0

मैं संकलक का उपयोग कर रहा हूं जो विजुअल स्टूडियो 2010 – Oktstrom

0

मुझे लगता है कि यह बहुत अधिक समस्या नहीं है।से 3।

11

Following एक example from Stroustrup:

template<class Test, class Base> 
struct AssertSameOrDerivedFrom { 
    AssertSameOrDerivedFrom() { &constraints; } 
public: 
    static void constraints() { 
    Test *pd = 0; 
    Base *pb = pd; 
    } 
}; 

template<class T> 
struct YourClass { 
    YourClass() { 
    AssertSameOrDerivedFrom<T, CBaseClass>(); 
    } 
}; 

C++ 0x में, यह हो जाता है:

template<class T> 
struct YourClass { 
    static_assert(std::is_base_of<CBaseClass, T>::value); 
}; 
+0

एक जोर के रूप में महान है, लेकिन एक परीक्षण के रूप में इतना अच्छा काम नहीं करता है। –

+0

@CrazyEddie: प्रश्न में कोड नमूना देखते हुए, मेरा मानना ​​है कि ओपी का अर्थ है "एक्स एक्स सी, अन्य वाई" के बजाय "चेक" द्वारा "जोर दें"। –

6

तो आपको यह स्पष्ट करना चाहते हैं, यह Nurk के तरीके से करना। यदि आप जांचना चाहते हैं, तो boost_C++ 0x से is_base_of का उपयोग करें। SFINAE आप उन दोनों में से किसी का उपयोग नहीं कर सकते हैं, का उपयोग करें:

template < typename Base, typename PotentialDerived > 
struct is_base 
{ 
    typedef char (&no) [1]; 
    typedef char (&yes) [2]; 

    static yes check(Base*); 
    static no check(...); 

    enum { value = sizeof(check(static_cast<PotentialDerived*>(0))) == sizeof(yes) }; 
}; 
संबंधित मुद्दे