我正在阅读模板元编程。我无法理解这些线是什么意思;以下代码涉及在链表上进行元编程。
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,例如,这是否意味着我在每个头部都有另一个递归的头部和尾部?
答案 0 :(得分:7)
不,typedef NIL Head;
并不代表您在每个NIL
中 NIL
。
这只是意味着NIL::Head
是NIL
的另一个名称。同上NIL::Tail
。
这意味着您可以递归地编写类型,例如NIL::Head::Tail::Tail::Tail::Head::Head
也是NIL
的名称。但是这里没有实际的递归类型。
答案 1 :(得分:2)
NIL
只是另一个名字。
它不是NULL
,因为已经采取了这种行为。
在这里,我们正在创建一个LISP,如#34; head&#34;并且&#34;尾巴&#34;。要表示列表的结尾,请放置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
s不在&#34;内&#34;类型,它们在内部定义,就像数据成员一样。它们更像是指针而不是成员。在非模板元编程中:
struct node {
node* head, *tail;
};
struct NIL:node{
NIL() : node{this, this} {}
};