Je veux déclarer deux types (internes à une classe templated sur K
et V
et en fournissant un comportement de mise en cache):Comment casser ce typedef circulaire?
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;
Bien sûr, ce n'est pas possible est, en raison de la définition circulaire . Je pourrais le bidouiller avec un void*
, mais je me demande s'il y a de la magie de déclaration avancée ou une autre technique qui fera mieux le travail.
(Oui, je sais qu'un boost::bimap
contournerait le problème).
Essayez-vous de créer une carte avec des données, puis un index de cette carte dans un ordre différent? –
La question a été soulevée alors que je me trompais avec un code de mise en cache LRU qui fonctionnait déjà (essentiellement une carte de valeur-clé complétée par un suivi afin que les enregistrements les moins récents puissent être purgés si nécessaire). La version originale a la valeur de chaque carte contenant le type de clé de l'autre carte, mais certains accès O (log n) peuvent être écrasés pour diriger les accès de l'itérateur en utilisant le formulaire ci-dessus. Mais je ne veux pas que cette question devienne un débat sur les mérites des implémentations de cache LRU! C'était plus que je me suis rendu compte que je ne savais pas comment gérer ce genre de problème typedef/forward-declaration. – timday
+1 C'est une bonne question. Si seulement je savais quel est le type que vous voulez exprimer. – wilhelmtell