2011-02-22 12 views
9

Bir şablona verilen türün projemde bir temel sınıftan miras alınıp alınmadığını kontrol etmek istiyorum.Şablon bağımsız değişkeninin sınıftan miras alındığını kontrol edin

template< class T : public CBaseClass > 
  • o şablonları ile bunu yapmak mümkün mü, bunu başka nasıl yapabiliriz değilse: Bir Aşağıdaki örnekte onu beklediğiniz gibi

    Bu çalışması gerekir?

+0

Kontrol http://stackoverflow.com/questions/4532281/how-to-test-whether-class-b-is-derived-from- class-a –

cevap

10

BOOST_STATIC_ASSERT ile birlikte Boost'dan boost::is_base_and_derived'u kullanabilirsiniz. TR1 veya C++ 0x desteğiyle bir derleyici kullanıyorsanız, standart kitaplıktaki (std::is_base_of ve C++ 0x'daki static_assert deyimindeki) yapıların eşdeğerleri vardır.

+0

Boost'u kullanmam mümkün değil, maalesef – Oktstrom

+1

@Oktstrom: Hangi derleyiciyi kullanıyorsunuz? TR1 veya C++ 0x'yi destekliyor mu? –

+0

Visual Studio 2010 – Oktstrom

11

Following bir example from Stroustrup: C++ 0x bu hale

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>(); 
    } 
}; 

:

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

Bir iddia olarak harika, ama bir test kadar iyi çalışmıyor. –

+0

@CrazyEddie: Sorudaki kod örneği verildiğinde, OP'nin "C, else Y ise X" yerine "kontrol" ile "iddia" anlamına geldiğini düşünüyorum. –

6

Eğer iddia istiyorsanız, Nurk yolunu bunu. Kontrol etmek isterseniz, is_pase veya C++ 0x is_base_of kullanın. bunlardan birine kullanamıyorsanız, kullanmak 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) }; 
}; 
İlgili konular