2013-11-28 20 views
5

? Başka bir deyişle: C++, bir şablon içindeki sınıfın başka bir şeyin alt sınıfı olduğunu söylememe izin veriyor mu?C++ Sınıf mirası ve şablonlar

+0

@LuchianGrigore: benzer, ancak bu işlevler hakkındadır ve bu derslerle ilgilidir. Çözümler biraz farklı olabilir (ör. Enable_if buradaki en yüksek cevaptır, ancak burada çok anlamlı değildir). –

cevap

4

Gerçekten direkt olarak değil. Ama bu gibi type_traits ile static_assert kullanabilirsiniz:

static_assert(is_base_of<A,B>::value, "C<B> requires B:A"); 

Örneğin Yapıcınızda o koyabilirsiniz, o zaman gereksinimi memnun değilse derlemek başarısız olur. Bunun tüm C++ 11 şeyler olduğuna dikkat edin, ancak bundan önce Boost'ta var ya da gerçekten takılırsanız kendinizi kodlayabilirsiniz (dil desteği gerektirmez). Bunun yerine bu yazabilir

template <class B> 
class C 
{ 
    //here you can check it, and generate your own error message! 
    static_assert(extends<B,A>(), 
       "Constraint Violation: B doesn't derive from A."); 

    B instance; 
}; 

Veya: Sonra olarak sınıfını tanımlamak

template<typename D, typename B> 
using extends = std::is_base_of<B,D>; 

:

5

olarak (sadece bir şeker kaplı adı olan) extends adında bir meta işlevi tanımlayın :

//define it a bit differently now! 
template<typename D, typename B> 
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type; 

template <class B, class Unused=extends<B,A>> 
class C 
{ 
     B instance; 
}; 

Ancak bu durumda, kendi erro'nuzu oluşturma fırsatınız yok. mesaj. Derleyici, no'lu no'lu hata mesajını atmakta zorluk çekiyor.

Her halükarda, muhtemelen std::is_base_of<>'u doğrudan kullanabileceğinizi biliyorsunuzdur. Ancak ismine şeker kaplı olarak bakıyorsanız, extends iyi geliyor!

+0

ikinci örnekte 'Unused' kaldırabilirsiniz –