C++ 模板类型是否在C++;?
我想看看作者是如何实现这些节点的。我的期望是一个过于简单的类/结构。相反,我看到一个基类和一个从这个基类继承的节点(仍然很简单,但为什么是两个类?)。他的评论解释了原因: 我们将ListNodeBase与ListNode(如下)分开定义,因为它允许 我们希望有非模板化的操作,如插入、删除(如下)和 使列表锚节点不携带t,这将 由于存在额外的Ts,浪费空间并可能导致用户惊讶 用户没有显式创建的。所有这些的缺点是 考虑到节点指针的重要性,它使得列表的调试查看变得更加困难 键入ListNodeBase而不是ListNode。但是,请参见下面的ListNodeBaseProxyC++ 模板类型是否在C++;?,c++,templates,C++,Templates,我想看看作者是如何实现这些节点的。我的期望是一个过于简单的类/结构。相反,我看到一个基类和一个从这个基类继承的节点(仍然很简单,但为什么是两个类?)。他的评论解释了原因: 我们将ListNodeBase与ListNode(如下)分开定义,因为它允许 我们希望有非模板化的操作,如插入、删除(如下)和 使列表锚节点不携带t,这将 由于存在额外的Ts,浪费空间并可能导致用户惊讶 用户没有显式创建的。所有这些的缺点是 考虑到节点指针的重要性,它使得列表的调试查看变得更加困难 键入ListNodeBase
有几件事我不明白。我确实理解为什么它会使调试查看变得更困难,但是他所说的
列表锚节点不带t是什么意思,
会浪费空间,并且可能会导致用户惊讶于存在额外的t,因为用户没有显式创建?在我看来,这样做的目的是将列表的抽象与它所携带的数据分开。当您真正想要访问数据时,只需要ListNode
,其余的都可以在抽象ListNodeBase
上完成。这就是我如何理解列表锚节点没有带t的原因
空间是有道理的。模板类是按类型创建的,因此如果您有几个不同的类型用于
T
,而没有ListNodeBase
,您将创建每种类型的所有操作的模板副本,而LinkNode
将继承它们,并且只需要实际数据的内存。在这种情况下,保存的空间似乎是指代码的实际大小。如果没有helper类,列表根节点将包含一个从未使用过的T实例。第二句话是说,您可能不希望空列表创建T。例如,创建T可能会有副作用。您确实希望支持空列表。如果head节点本身始终包含一个T,并且每个列表都包含一个head节点,那么每个列表都至少包含一个T,因此永远不能为空。不使用没有数据的列表。在列表的每个实例中,甚至在空列表中,都存在一个名为锚节点或sentinel的节点,以消除与空列表相关的一些特殊情况代码。正是这一个节点不需要包含用户数据。@n.m.这将是类列表
,您可以在OP发布的链接上查看实现。由于列表本身就是哨兵,这一点毫无意义。我已经看过了。据我所知,列表
包含哨兵,位于base\u node\u type mNode代码>行。