[英]What is the meaning of `struct X typedef` vs. `typedef struct X`?
[英]What is struct NIL { typedef NIL Head; }?
我正在閱讀模板元編程。 我無法理解這些線是什么意思; 以下代碼涉及在鏈表上進行元編程。
struct NIL {
typedef NIL Head;
typedef NIL Tail;
};
template <typename H, typename T=NIL> struct Lst {
typedef H Head;
typedef T Tail;
};
template <int N> struct Int{ static const int result = N; };
typedef Lst< Int<1>, Lst< Int<2>, Lst< Int<3> > > > OneTwoThree;
以上內容來自https://monoinfinito.wordpress.com/series/introduction-to-c-template-metaprogramming/ 。 我非常感謝有關struct NIL具有什么意義的指導,它具有typedef NIL Head和typedef NIL Tail。 Nil是一種類型,當然,但是如果我有typedef NIL Head,例如,這是否意味着我在每個頭部內都有另一個遞歸的Head和Tail?
不, typedef NIL Head;
並不意味着你有一個 NIL
每個內NIL
。
它只是意味着NIL::Head
是NIL
另一個名稱。 同樣適用於NIL::Tail
。
這意味着你可以遞歸地編寫類型,例如NIL::Head::Tail::Tail::Tail::Head::Head
也是NIL
的名稱。 但是這里沒有實際的遞歸類型。
NIL
只是另一個名字。
它不是NULL
因為這是采取的。
在這里,我們正在創建一個LISP,如“head”和“tail”的鏈接列表。 要表示列表的末尾,請放置一個NIL
。
NIL
滿足列表的布局,但是頭部和尾部都是NIL
。 我自己會被寫成:
struct NIL;
template <typename H, typename T=NIL> struct Lst {
typedef H Head;
typedef T Tail;
};
struct NIL:Lst {};
使NIL
作為空列表的名稱更加清晰。
通過使NIL
具有頭部和尾部,一些模板元編程變得更容易(並且一些變得更難)。 它們是相同類型的事實意味着在某種意義上, NIL
列表具有無限長度; 但在另一種意義上它的長度為零,因為我們將長度定義為距離達到NIL
之前的距離。
typedef
不在類型內,它們在內部定義,就像數據成員一樣。 它們更像是指針而不是成員。 在非模板元編程中:
struct node {
node* head, *tail;
};
struct NIL:node{
NIL() : node{this, this} {}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.