2015-01-18 14 views
5

W języku programowania(str. 4) Stroustrupa (czwarta edycja) sekcja 27.4.2 przedstawia technikę "linearyzacji" hierarchii klasy diamentów, aby uniknąć narzutów na wirtualne klasy bazowe. Zaczyna z wzorem diamentu z prawdziwego projektu (Pivot code analyzer tool):Wyjaśnienie hierarchii klas hierarchicznych według Stroustrupa, przykład

enter image description here

Wersja liniowy jest narysowany jako:

enter image description here

i

enter image description here

The Zarys kodu:

namespace ipr { 
    struct Node { ... }; 
    struct Expr : Node { ... }; 
    struct Stmt : Expr { ... }; 
    struct Decl : Stmt { ... }; 
    struct Var : Decl { ... }; 

    namespace impl { 
     template<class T> struct Node : T { ... }; 
     template<class T> struct Expr : Node<T> { ... }; 
     template<class S> struct Stmt : S { ... }; 
     template<class D> struct Decl : Stmt<Expr<D>> { ... }; 
     struct Var : Decl<ipr::Var> { ... }; 
    } 
} 

Jestem zdezorientowany przez nieregularną strukturę. Na podstawie wstępnego opisu, spodziewałem impl wyglądać mniej więcej tak:

namespace impl { 
    template<class T> struct Node : T { ... }; 
    template<class T> struct Expr : Node<T> { ... }; 
    template<class S> struct Stmt : Expr<S> { ... }; 
    template<class D> struct Decl : Stmt<D> { ... }; 
    struct Var : Decl<ipr::Var> { ... };  
} 

I myślę pełny schemat tych zajęć jest:

enter image description here

Moje pytanie brzmi:, dlaczego trzy klasy szablonów "wnętrza" nie mają form równoległych, tak jak w mojej wersji kodu?

Odpowiedz

2

Mój najlepszy przypuszczenie pochodzi patrząc na actual Pivot code który ma

template<class D> struct Decl : Stmt<Node<D>> { ... }; 

zamiast Stroustrup na

template<class D> struct Decl : Stmt<Expr<D>> { ... }; 

To sugeruje, że impl::Stmt niekoniecznie wynikają z impl::Expr mimo wszystko, jak w oryginale Diamentowy diagram (choć nadal wywodzi się z interfejsu ipr::Expr). To nie wynika z impl::Expr dla Decl i Var, ale robi dla innych klas wykonawczych, takich jak impl::For:

struct For : Stmt<Expr<ipr::For> > { ... } 

Nie jestem pewien, dlaczego Stroustrup nie wyjaśnił nieprawidłowości. Być może sądził, że usunął go zmieniając Stmt<Node> na Stmt<Expr>, a może w ogóle go nie zmienił (to znaczy, kod zmienił się po skopiowaniu) i chciał go zostawić bez wyjaśnienia każdego szczegółu.

Mamy nadzieję, że lepsza odpowiedź wyjaśni to.

Powiązane problemy