最近、侵入リストのコンテキストでこのコードに出くわしました。
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.
..
..
};
ブースト侵入型リスト ライブラリ( member_hook<class T, class Hook, Hook T::* PtrToMember>
) にも同様のコードがあります。
私の質問は、テンプレート引数に関するものNode<T> T::*NODE
です。私は C++ の専門家ではありませんが、この特定の構文にこれまで出会ったことがなく、理解するために何を検索すればよいかわかりません。
どういう意味ですか?その目的は何ですか?「NODE は T に属するノードへのポインタです」と解釈する必要がありますか? T には事前に特定のメンバーが含まれていることがわかっておらず、私の知る限り、::
スコープを解決するために使用されるため、これは私には意味がありません。
同様に、誰かが*NODE
この行での使用を明確にすることができれば、たとえば : Node<T> *node = &(elem->*NODE);
、これが何のために使用されているかを理解するのに役立ちます.