Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类型是否在C++;?_C++_Templates - Fatal编程技术网

C++ 模板类型是否在C++;?

C++ 模板类型是否在C++;?,c++,templates,C++,Templates,我想看看作者是如何实现这些节点的。我的期望是一个过于简单的类/结构。相反,我看到一个基类和一个从这个基类继承的节点(仍然很简单,但为什么是两个类?)。他的评论解释了原因: 我们将ListNodeBase与ListNode(如下)分开定义,因为它允许 我们希望有非模板化的操作,如插入、删除(如下)和 使列表锚节点不携带t,这将 由于存在额外的Ts,浪费空间并可能导致用户惊讶 用户没有显式创建的。所有这些的缺点是 考虑到节点指针的重要性,它使得列表的调试查看变得更加困难 键入ListNodeBase

我想看看作者是如何实现这些节点的。我的期望是一个过于简单的类/结构。相反,我看到一个基类和一个从这个基类继承的节点(仍然很简单,但为什么是两个类?)。他的评论解释了原因:

我们将ListNodeBase与ListNode(如下)分开定义,因为它允许 我们希望有非模板化的操作,如插入、删除(如下)和 使列表锚节点不携带t,这将 由于存在额外的Ts,浪费空间并可能导致用户惊讶 用户没有显式创建的。所有这些的缺点是 考虑到节点指针的重要性,它使得列表的调试查看变得更加困难 键入ListNodeBase而不是ListNode。但是,请参见下面的ListNodeBaseProxy


有几件事我不明白。我确实理解为什么它会使调试查看变得更困难,但是他所说的
列表锚节点不带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行。