2016-04-28 14 views
1

Ich las dieses tutorial auf variadische Vorlagen, aber in folgenden Code:C++ typedef und Vorlagen Syntax?

template<int index, class C> 
struct container_index { 

    // points to the "next" container type 
    typedef typename container_index< 
    index-1, 
    typename C::base_container 
    >::container_type container_type; 

    // points to the next T-type 
    typedef typename container_index< 
    index-1, 
    typename C::base_container 
    >::type type; 
}; 

diese typedefs scheint überflüssig, aber es kompiliert gut. Das Problem ist einfach ich verstehe nicht, warum sie so sind und ich fand kein Tutorial, das diesen Fall erklärt. Könnte jemand eine Erklärung geben? Warum der typedef Name wiederholt:

"::container_type container_type;" 

"::type type;" 

Es kann nicht einfach so sein:

typedef typename container_index< 
     index-1, 
     typename C::base_container 
     > type; 

Vielen Dank.

+1

Wegen Rekursion? Siehe auch die Diskussion in [diese Frage] (http://stackoverflow.com/questions/36913554/c-typedef-and-templates-syntax). –

Antwort

1

Das Beispiel zeigt eine rekursive Typdefinition in Vorlagen. Der Schlüssel ist, dass der Rekursion Basisfall für index = 0 als Spezialisierung angegeben:

template<class C> 
struct container_index<0, C> { 

    // point to C instead of C::base_container 
    typedef C container_type; 

    // point to C::type instead of C::base_container::type 
    typedef typename C::type type; 
}; 

Es ist dieser Basis-Fall, dass der Typ Abzug möglich macht. So wird beispielsweise der Typ container_index < 2, MyCont> :: container_type zu container_index < 1, MyCont> :: container_type erweitert, was wiederum zu container_index < 0, MyCont> :: container_type, expandiert und schließlich zu MyCont erweitert.

+0

Ich verstehe es jetzt. Solange die Klasse "C" diesen "type" hat (wie typedef T type), wird jeder Typabzug vorgenommen. Dieser Teil verwirrte mich mehr. Danke Jungs! –

0

typedef gibt einem Typ einen Namen. Sie müssen also sowohl den Typ als auch den Namen angeben, den Sie ihm geben möchten.

In

typedef typename container_index<index-1, typename C::base_container>::type type;

die typename container_index<index-1, typename C::base_container>::type beschreiben wir die Art, wie wir einen Namen, und die letzten type vor dem Semikolon geben wollen, ist der Name, den wir es nennen wollen.

vergleichen:

struct Example 
{ 
    typedef Fruit::orange citrus; // declare a type called Example::citrus, which is the same type as Fruit::orange 
    typedef Fruit::apple apple; // declare a type called Example::apple, which is the same type as Fruit::apple - the same operation as the line above, and so the same syntax! 
}; 
+0

Was ich nicht unterstelle ist, dass es scheint, dass der Programmierer typedefing einen Typ gibt, der nicht existiert: typedef typenname container_index :: type type; Programmierer ist typedefing neuer Typ namens "Typ" basierend auf dem alten Typ namens "Typ", die nicht in container_index Vorlage existiert? –

+0

Sergio: die Spezialisierung struct container_index <0, C> ein wenig weiter unten im Tutorial bietet einen konkreten Typ, der als Ausgangspunkt existiert, und alles andere wird definiert, indem man das ändert. – moonshadow