Voglio dichiarare un paio di tipi (interni a una classe su modelli su K
e V
e fornendo qualche comportamento della cache):Come rompere questo typedef circolare?
typedef std::map<
long long,
typename key_to_value_type::iterator // Ooops... not declared yet
> timestamp_to_key_type;
typedef std::map<
K,
std::pair<V,typename timestamp_to_key_type::iterator>
> key_to_value_type;
Naturalmente questo non è possibile in quanto è, a causa della definizione circolare . Potrei hackerarlo con un void*
, ma mi chiedo se ci sia qualche magia in avanti o altra tecnica che farà meglio il lavoro.
(Sì, so che uno boost::bimap
aggirerebbe il problema).
Stai cercando di creare una mappa con i dati e quindi un indice di quella mappa in un ordine diverso? (Presumibilmente per una rapida consultazione) –
La domanda è venuta fuori mentre stavo scherzando con un codice di cache LRU già funzionante (fondamentalmente una mappa valore-chiave integrata con il tracciamento in modo che i record utilizzati meno di recente possano essere eliminati quando necessario). La versione originale ha il valore di ogni mappa per contenere il tipo di chiave dell'altra mappa, ma alcuni accessi O (log n) potrebbero essere schiacciati per dirigere gli accessi iteratore usando il modulo sopra. Ma non voglio che questa domanda si trasformi in un dibattito sui meriti delle implementazioni della cache di LRU! È stato più che mi sono reso conto che non sapevo come gestire al meglio questo tipo di problema typedef/forward-declaration. – timday
+1 Questa è una buona domanda. Se solo sapessi qual è il tipo che stai cercando di esprimere. – wilhelmtell