2013-11-24 12 views
7

Il problema è stato discusso molte volte prima. Cosa fare se si ha la necessità:implementazione grafico/albero con tipi incompleti

struct Node 
{ 
    ::std::vector<Node> nodes_; 
}; 

Da here si ha l'impressione che (smart) puntatori a Node* potrebbe essere la soluzione canonica. Ciò implica un'ulteriore indiretta e un corrispondente impatto sulle prestazioni. Da here, vediamo che libstdc++ supporta le istanze ::std::vector<T>, dove T è un tipo incompleto, ma non libc++. Questo è difficilmente trasportabile. Ma una soluzione potrebbe essere un container di tipo portatile ::std::vector che supporti tipi incompleti. Infine, possiamo fare:

template <::std::size_t I = 0> 
struct Node 
{ 
    ::std::vector<Node<I + 1> > nodes_; 
}; 

template <> 
struct Node<20> 
{ 
}; 

che impone limitazioni sul nostro grafico/albero. Esistono soluzioni alternative aggiuntive, a causa del fatto che un Node s contiene Node s, ma è un tipo incompleto al punto di dichiarazione di ::std::vector<Node> nodes_;?

+0

C'è una biblioteca spinta per questo: http://www.boost.org/doc/libs/1_48_0/doc/html/container/containers_of_incomplete_types.html. – zch

+0

@zch Rendi il tuo commento una risposta? Accetterò – user1095108

risposta

2

Boost containers gestire tipi incompleti e sono portatili.

Così il vostro nodo può diventare:

#include <boost/container/vector.hpp> 

struct Node 
{ 
    boost::container::vector<Node> nodes_; 
}; 
Problemi correlati