je suis tombé sur ce code récemment, dans le contexte des listes intrusives:Quelle est la signification des arguments de modèle de ce type - `ClassA <T> T :: * ELEM`?
template<typename T> struct Node{
T *next;
T *prev;
Node(): next(nullptr), prev(nullptr){}
};
/*
* Intrusive doubly-linked-list
*
* */
template<typename T, Node<T> T::*NODE>
class List{
T *head;
T *tail;
public:
List():head(nullptr), tail(nullptr){}
~List() {clear();}
/*
* Add an element at the head of list
* @param elem item to be inserted
* */
void add_to_front(T *elem){
Node<T> *node = &(elem->*NODE);
assert((node->next) == nullptr);
assert((node->prev) == nullptr);
node->next = head;
if(head != nullptr){
Node<T> *temp = &(head->*NODE);
temp->prev = elem;
}
head = elem;
if(tail == nullptr)
tail = head;
}
//other member functions ,etc.
..
..
};
Je vois un code similaire dans le coup de pouce intrusive list library (member_hook<class T, class Hook, Hook T::* PtrToMember>
).
Ma question concerne l'argument modèle Node<T> T::*NODE
. Je ne suis pas un expert en C++, mais je n'ai jamais rencontré cette syntaxe particulière auparavant, et je ne sais pas quoi chercher pour le comprendre.
Qu'est-ce que cela signifie? Quel est son but, et que dois-je interpréter comme - "NODE est un pointeur vers un nœud, appartenant à T"? Cela n'a pas de sens pour moi, parce que T n'est pas connu pour contenir des membres spécifiques à l'avance, et autant que je sache, ::
est utilisé pour résoudre la portée.
De même, si quelqu'un pouvait clarifier l'utilisation de *NODE
dans cette ligne, par exemple: Node<T> *node = &(elem->*NODE);
, cela m'aiderait à comprendre à quoi cela sert.
est-il attendu que T ait un membre de type Node? –
aspen100
@ aspen100 Oui, c'est le bit intrusif. Pour être utilisable en tant qu'élément 'List',' T' doit contenir un membre 'Noeud' quelque part. L'emplacement de ce membre est spécifié par le pointeur de membre 'NODE'. –
melpomene