2013-07-30 16 views
6

C'è un modo per ottenere un tipo di modello ricorsivo? Ho un contenitore per il quale voglio specificare una strategia di archiviazione sottostante. Il modello interno deve tuttavia utilizzare il tipo del modello esterno, quindi provoca un loop nella definizione del tipo, che non è possibile specificare.Un tipo di modello ricorsivo per un inoltro container/typename

A proposito di quello che voglio:

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

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

C++ 11 soluzioni vanno bene (anche se sono ancora in gcc 4.6.3).

+3

C'è qualcosa chiamato "modello di modello curiosamente ricorsivo" (CRTP)? Forse aiuterà, non è sicuro ... http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Jimbo

+0

Quali sono i nuovi comportamenti che questo tipo di dati ricorsivo avrà che lo differenziano da un elenco collegato? – abiessu

+0

@abiessu, il mio uso corrente è in realtà per un albero radix. Ogni nodo ha un indice di come arrivare al nodo successivo, e 'inner' è ciò che specifica la strategia per quell'indice. Cioè, il modello permette di dire come sono gestiti i bambini, al contrario di un fisso rosso-nero, hash o altra strategia. –

risposta

5

È necessario dire al compilatore che Inner è una classe template:

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

Perché deve essere 'classe' prima di Inner? Capisco che non sia più un parametro generico, ma un tipo di classe, anche se mi aspettavo che anche 'struct' funzionasse. Dal momento che non lo è, non sono sicuro di capire. –

+0

@ edA-qamort-ora-y È come funzionano i modelli. Puoi utilizzare la parola chiave 'typename' generica o' class'. Comunque in questo caso poiché 'Inner' è una classe template, deve essere dichiarata come' class' template. È possibile definire le strutture basate su modelli, ma non all'interno di un elenco di argomenti del modello. –

0

io non sono sicuro perché si sta aggiungendo il parametro di template Inner tipo, dal momento che si sta definendo holder essere un tipo basato su Container e inner, entrambi disponibili nel punto in cui dichiari il detentore.

Si prevede di utilizzare qualsiasi tipo diverso da struct inner come parametro del modello su Container? In caso contrario, il seguente codice semplificato compilato e ha funzionato per me 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(); 
} 

Fondamentalmente, questo è supponendo che il container è sempre definendo holder in termini di inner, che aiuta a sbarazzarsi del parametro modello supplementare, quando che definisce Container. Spero che questo aiuti :) arun

+0

Informazioni su Interno, sì, questo è lo scopo, è possibile selezionare il tipo utilizzato per la classe interna. –

Problemi correlati