2013-11-28 13 views
5

chciałbym napisać w moim C++ programu coś takiego:C++ klasy i dziedziczenie szablonów

class A { 
public: 
    void a(); 
} 

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

to jest możliwe? Innymi słowy: czy C++ pozwala mi powiedzieć, że klasa w szablonie jest podklasą czegoś innego?

+0

@LuchianGrigore: podobny, ale ten dotyczy funkcji, a dotyczy klas. Rozwiązania mogą się nieznacznie różnić (np. Opcja enable_if jest tam najlepszą odpowiedzią, ale nie ma tu większego sensu). –

Odpowiedz

4

Nie tak naprawdę w bezpośredni sposób. Ale można użyć static_assert z type_traits, tak:

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

że można umieścić w konstruktorze na przykład, wtedy nie będzie można skompilować jeśli wymóg ten nie jest spełniony. Zauważ, że to wszystko jest w C++ 11, ale istnieje w Boost na długo przed tym, lub możesz sam go zakodować, jeśli naprawdę utkniesz (nie wymaga obsługi języka).

5

Zdefiniuj meta funkcję o nazwie extends (który jest tylko nazwa pokryta cukrem) jako:

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

Następnie zdefiniować swoją klasę jako:

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

Lub można napisać to zamiast :

//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; 
}; 

Ale w tym przypadku nie masz możliwości wygenerowania własnego erro r wiadomość. Kompilator może rzucić na ciebie dowolny komunikat o błędzie, który może być trudny do zrozumienia.

W każdym razie prawdopodobnie zdajesz sobie sprawę, że możesz bezpośrednio użyć std::is_base_of<>. Ale jeśli szukasz pokrytej cukrem nazwy nazwa, wtedy extends brzmi dobrze!

+0

możesz usunąć "Niewykorzystany" z drugiego przykładu –

Powiązane problemy