2016-05-13 26 views
0

diese Bedenken Sie:inhärierende Typdeklarationen in einer Hierarchie von Vorlagen

template <typename T> 
struct A { 
    using MyType1 = ...; 
    using MyType2 = ...; 
    using MyType3 = ...; 
    using MyType4 = ...; 
    using MyType5 = ...; 
    ... 
}; 

template <typename T> 
struct B: A<T> { 
    using MyType1 = typename A<T>::MyType1; 
    using MyType2 = typename A<T>::MyType2; 
    using MyType3 = typename A<T>::MyType3; 
    using MyType4 = typename A<T>::MyType4; 
    using MyType5 = typename A<T>::MyType5; 
    ... 
}; 

template <typename T> 
struct C: A<T> { 
    using MyType1 = typename A<T>::MyType1; 
    using MyType2 = typename A<T>::MyType2; 
    using MyType3 = typename A<T>::MyType3; 
    using MyType4 = typename A<T>::MyType4; 
    using MyType5 = typename A<T>::MyType5; 
    ... 
}; 

... // Many more classes in the hierarchy 
    // with all the type declarations duplicated in each of them. 

Gibt es eine Möglichkeit, dies kürzer gemacht werden kann?

Ein verwandter question wurde gefragt, aber machte nicht den Punkt, wie schlecht die Duplizierung war und erhielt keine Antworten.

+1

Verwenden Sie MSVC? Dieser Code sollte sowieso nicht kompiliert werden, da 'A :: MyTypeN' ein abhängiger Typ ist, der' typeName A :: MyType1' sein muss. – TartanLlama

+0

Fest, danke. Nein, ich benutze 'gcc'. – AlwaysLearning

+0

Keine Ahnung, was Sie tun möchten. Warum nicht einfach 'typename A :: MyType1' oder' typename B :: MyType1', 'typename C :: MyType1' ...? – songyuanyao

Antwort

1

Wenn Sie die Typnamen in der abgeleiteten Klasse nicht importieren oder deklarieren möchten, müssen Sie dem Compiler zumindest mitteilen, dass er die Typnamen in der abgeleiteten Klassenhierarchie nachschlagen soll.

Sie können dies tun, den Namen der abgeleiteten Klasse als den Rahmen der Qualifikation mit:

typename B::MyType1 x; 

Wenn B ist ein langer Name, oder Sie wollen frei Code der Lage sein, zwischen B und C zu bewegen, Sie kann herkömmlich einen typedef an der Spitze der Klasse hinzufügen:

template <typename T> 
struct B: A<T> { 
    using ThisType = B; 
    // ... 
    typename ThisType::MyType1 x; 
};