【问题标题】:What is struct NIL { typedef NIL Head; }?什么是 struct NIL { typedef NIL Head; }?
【发布时间】:2018-02-12 04:55:03
【问题描述】:

我正在阅读有关模板元编程的信息。我不明白这些行是什么意思;以下代码涉及对链表进行元编程。

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 中都有另一个递归 Head 和 Tail?

【问题讨论】:

  • 这里有一个关于NILism 的笑话。
  • 我曾经见过一些坏名字,但NIL 就在那儿,因为屡获殊荣的坏名字。这个名字具有惊人的误导性。任何建议这样做的人都是疯狂的科学家,我说的不是好人。
  • 大概它代表 Node in List,但最好将其拼写为 NodeInList 而不是 NIL
  • @tadman 它实际上是类似 NULL 的东西的一个非常常见的名称,它用于 LISP 和 Lua(尽管这里的灵感显然是 LISP)。
  • 在 C++11 及更高版本中,通常使用 std::tuple 实例化作为类型列表。现代 C++(和 Loki 库)中的技术不再非常相关。你最好买一本 2011 年后的书。

标签: c++ templates template-meta-programming


【解决方案1】:

不,typedef NIL Head; 并不意味着您在每个NIL 中都有一个 NIL

这只是意味着NIL::HeadNIL 的另一个名称。 NIL::Tail 同上。

这确实意味着您可以递归地编写类型,例如NIL::Head::Tail::Tail::Tail::Head::Head 也是NIL 的名称。但是这里没有实际的递归类型。

【讨论】:

【解决方案2】:

NIL 只是另一个名字而已。

这不是NULL,因为那是被占用的。

在这里,我们正在创建一个类似 LISP 的“头”和“尾”链表。要表示列表的结尾,请放置 NIL

NIL 满足列表的布局,但一个头部和尾部都是NIL。我自己很想写:

struct NIL;

template <typename H, typename T=NIL> struct Lst {
  typedef H Head;
  typedef T Tail;
};

结构 NIL:Lst{};

NIL作为空列表的名字更清晰。

通过使NIL 具有头部和尾部,一些模板元编程变得更容易(而另一些变得更难)。它们是同一类型的事实确实意味着在某种意义上NIL 列表的长度是无限的。但在另一种意义上,它的长度为零,因为我们将长度定义为到达NIL 之前的距离。

typedefs 不在类型“内”,它们像数据成员一样在内部定义。它们更像是指针而不是成员。在非模板元编程中:

struct node {
  node* head, *tail;
};
struct NIL:node{
  NIL() : node{this, this} {}
};

【讨论】:

  • 它是“nil”,因为“nil”是名词,“null”是形容词。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
  • 2019-03-30
  • 2016-07-14
  • 2011-06-26
相关资源
最近更新 更多