繁体   English   中英

什么是struct NIL {typedef NIL Head; }?

[英]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::HeadNIL另一个名称。 同样适用于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM