2013-07-30 7 views
6

Gibt es eine Möglichkeit, einen rekursiven Vorlagentyp zu erhalten? Ich habe einen Container, für den ich eine zugrunde liegende Speicherstrategie angeben möchte. Die innere Vorlage muss jedoch den Typ der äußeren Vorlage verwenden, sodass in der Typendefinition eine Schleife entsteht, die nicht spezifiziert werden kann.Ein rekursiver Vorlagentyp für eine Container-/Typenname-Weiterleitung

über das, was ich will:

template<typename C> 
struct inner { 
    C * object[16]; 
}; 

template<typename T, typename Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 

C++ 11-Lösungen sind in Ordnung (obwohl ich immer noch auf gcc 4.6.3 bin).

+3

Gibt es etwas namens "seltsam rekursive Vorlage Muster" (CRTP)? Vielleicht wird es helfen, nicht sicher ... http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Jimbo

+0

Was sind die neuen Verhaltensweisen, die dieser rekursive Datentyp haben wird, die es von einer verknüpften Liste unterscheiden? – abiessu

+0

@abiessu, meine aktuelle Verwendung ist eigentlich für einen Radix-Baum. Jeder Knoten hat einen Index, wie er zum nächsten Knoten gelangt, und "inner" gibt die Strategie für diesen Index an. Das heißt, die Vorlage ermöglicht es zu sagen, wie die Kinder verwaltet werden, im Gegensatz zu einer festen Rot-Schwarz-, Hash- oder anderen Strategie. –

Antwort

5

Sie müssen den Compiler sagen, dass Inner eine Templat-Klasse ist:

template<typename T, template<typename> class Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 
+0

Warum muss es "Klasse" vor Inner sein? Ich verstehe, dass es kein generischer Parameter mehr ist, sondern ein Klassentyp, obwohl ich erwartet habe, dass "struct" auch funktioniert. Da ich es nicht weiß bin ich mir nicht ganz sicher. –

+0

@ edA-qamort-ora-y So funktionieren Vorlagen. Sie können entweder das allgemeine Schlüsselwort 'typename' oder' class' verwenden. Da in diesem Fall "Inner" selbst eine Template-Klasse ist, muss sie als Template "class" deklariert werden. Sie können Vorlagenstrukturen definieren, jedoch nicht innerhalb einer Vorlagenargumentliste. –

0

Ich bin nicht sicher, warum Sie Hinzufügen der Inner Art Template-Parameter, da Sie holder sind definiert, ein Typ zu sein basierend auf Container und inner, die beide an dem Punkt verfügbar sind, an dem Sie den Inhaber deklarieren.

Planen Sie einen anderen Typ als struct inner als Vorlagenparameter für Container? Wenn nicht, wird die folgende vereinfachte Code kompiliert und lief für mich in VS2010:

#include <vector> 
#include <stdio.h> 

template <typename C> 
struct inner{ 
    C * objects[16]; 
    bool hasobj; 

    inner():hasobj(false){} 
}; 

template <typename T> 
class Container { 
    inner<Container> holder; 
    T value; 
public: 

    Container(const T& valueP){ 
     value = valueP; 
    } 
    void AddChild(Container* rhs){ 
     holder.objects[0] = rhs; //Always using first location, just for example 
     holder.hasobj = true; 
    } 

    void PrintStuff()const{ 
     if(holder.hasobj){ 
      holder.objects[0]->PrintStuff(); 
     } 
     printf("VAL IS %d\n", value); 
    } 
}; 

int main(){ 
    Container<int> c(10); 

    Container<int> c1(20); 
    c1.AddChild(&c); 
    c1.PrintStuff(); 
} 

Im Grunde ist dies unter der Annahme, dass die container immer holder in Bezug auf inner wird definiert, welche der zusätzlichen Template-Parameter loszuwerden hilft, wenn Definieren Container. Hoffe, das hilft :) arun

+0

Über Inner, ja, das ist der Zweck, Sie können den Typ auswählen, der für die innere Klasse verwendet wird. –

Verwandte Themen