我有一个模板链接列表实现,其中
T List<T>::GetElementFromHead()
返回列表头部的值。当列表为空时应返回什么值。
template <class T>
T List<T>::GetElementFromHead()
{
T element;
if (!IsEmpty())
{
element = Head->value;
}
return element;
}
如果IsEmpty()
返回true,则return element;
抛出异常。
在这种情况下如何返回 null 或空值?
最佳答案
What value should be returned when the list is empty.
有两个合理的选择。
谁在乎呢。设置为仅当列表不为空时才调用
GetElementFromHead()
的前提条件,然后您可以编写:template <class T> T& List<T>::GetElementFromHead() { return Head->value; }
这有几个好处。没有拷贝。它很快。如果我愿意,我可以修改该值。没有额外的分支,因为您要求用户预先执行此操作。无需担心错误情况是什么或得出合理的哨兵值。如果返回
T{}
,如果T
是int
并且列表通常可以有0
会怎样 - 如何用户如何区分“真实”0
和“假”0
?这就是标准库实现
list::front()
的方式,vector::front()
等。像标准库那样做通常是一个不错的决定。封装在返回值本身中,无论它是否是真实值:
template <class T> std::optional<T> List<T>::GetElementFromHead() { if (!IsEmpty()) { return Head->value; } else { return std::nullopt; } }
(如果使用
boost::optional
,最后一行应返回boost::none
)。这样,返回值本身就清楚地表明了我们所处的情况 - 我们要么有一个值并且该值位于列表的前面,要么我们没有值。再次强调,无需设置哨兵。此方法的另一个版本是在失败时返回
T*
和nullptr
。这样做的优点是它不会产生拷贝或要求T
可复制构造。
关于c++ - 模板变量的默认返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40272188/