Je suis en train de modifier une classe complexe qui a des noeuds pointant sur eux-mêmes comme des listes ou des graphiques liés. Je veux qu'il soit utilisé dans la mémoire partagée à l'aide boost :: fonctions interprocessus. Maintenant, je cherche le moyen de le redessiner de telle sorte qu'il reste générique et implique le moins de changements.Création de classes pour les classes auto-liées avec type de pointeur générique
template< class T >
class node {
public:
T data;
node* prev;
node* next;
};
La refonte devrait utiliser le boost :: :: interprocessus allocateur allocateur afin d'utiliser implicitement les pointeurs intelligents relatifs de type boost :: :: interprocessus offset_ptr. Je pensais que ce devrait impliquer un second paramètre de modèle comme
template< class T, class alloc_type = std::allocator< node<T> > >
class node {
public:
T data;
typename alloc_type::pointer prev;
typename alloc_type::pointer next;
};
qui bien sûr ne fonctionne pas en raison de dépendances cycliques comme des références.
J'espère que peut obtenir de l'aide d'un modèle de classe C++ pro sur la meilleure façon de le mettre en œuvre. J'ai jeté un coup d'œil sur les conteneurs boostés à mémoire partagée, mais ils le résolvent d'une manière plutôt compliquée qui implique plusieurs classes externes.
Joh
Cela ressemble étrangement à une classe de nœuds dans une liste doublement chaînée.Est-ce parce que vous simplifiez le code d'exemple, ou est-ce bien ce à quoi cette classe ressemble? Si ce dernier, pourquoi ne pas utiliser 'std :: list' et passer un custom-allocator? – sbi
C'est en raison de la simplification qu'il s'agit en fait d'une classe arborescente complexe. BTW: avec les implémentations std :: list, cela ne semble pas garantir qu'ils utiliseront le pointeur allocator :: car le standard dit qu'il est équivalent à un pointeur brut. C'est pourquoi boost :: interprocess fournit un ensemble de conteneurs standards. – Joh